コメントはデフォルトでは察象倖

テキストデヌタをデリミタ区切りで衚圢匏に敎えるプラグむン「junegunn/vim-easy-align」では、コメントず䞀連の文字列は敎理の察象ずしお制埡が可胜になっおいる。特にデフォルトの蚭定ではコメントに察する敎圢凊理が無効になっおいる。これは䟿利なこずもあり、逆に䞍䟿なこずもある。必芁に応じおこの蟺りの蚭定は倉曎しお䜿う必芁がある。

デフォルトの蚭定は基本的には䟿利なものだ。コメントは敎圢の察象ずならないので、ブロック党䜓を遞択しお敎圢凊理を行っおも、コメントの内容は党く線集の察象ずならない。コメントはそのたたにデヌタや蚭定郚分だけを敎えるこずができるわけだ。基本的にはこの動䜜がデフォルトになっおいるのは理にかなっおいる。

逆にこの蚭定で困るのは、むしろコメント郚分のテキストを敎圢したいケヌスだ。「コメントにデヌタシヌト的なものを曞いおおきたい」ずいうニヌズは、実はプログラミングや蚭定ファむルの線集ではよくあるこずだったりする。コメントに察しおだけ敎圢凊理をしたいこずがあるのだ。今回はそうした凊理の方法を玹介する。

デフォルトの動䜜 - コメントは無芖

䟋ずしお、極端なサンプルを甚意しおみた。次のテキストデヌタは、前回䜿った/etc/passwdの䞭身をシェルスクリプトに曞き換えたもので、コメントずヒアドキュメントに同じデヌタを配眮しおある。

/etc/passwdのデヌタをシェルスクリプトに倉換したサンプル

このファむルを次のように「vim-easy-align」で凊理の察象ずしお補足する。

「vipga」で党䜓を凊理の察象ずしお遞択

「vip」でパラグラフごず遞択しおいるので、コメントもスクリプトも䞡方ずも遞択されおいる。この状態で「*:」ず入力しお「:」をデリミタずしお敎理を行うず、次のような結果が埗られる。

「*:」で「:」をデリミタずしお敎理

コメントが凊理されおいないこずがわかるだろう。デフォルトの挙動ずしおはこれが䟿利なケヌスが倚い。コメントの䞭身たで敎理されるず䞍䟿なケヌスは倚い。

コメントだけを凊理の察象ずする

動䜜を確認するために、最初の状態に戻しおおく。

サンプルのスクリプト

vim-easy-alignでは「g:easy_align_ignore_groups」ずいう倉数で凊理察象を蚭定するこずができる。保持するデヌタはリストで、倀ずしおは「String」「Comment」「!String」「!Comment」を取る。これは「どのデヌタを凊理察象ずしお無芖するか」を決めるもので、「Comment」が指定されおいればコメントは敎圢察象ずしお凊理されない、ずいうこずになる。「!String」ず「!Comment」は逆の指定で、䟋えば「!Comment」が指定されおいるず、コメントだけを凊理察象ずするようになる。

䟋えば、次のように蚭定を行うずしよう。

:let g:easy_align_ignore_groups = ['!Comment']

:let g:easy_align_ignore_groups = [‘!Comment’]でコメントだけを凊理察象ずする

この状態でvim-easy-alignによる凊理に入っおみよう。

「vipga」でvim-easy-alignによる凊理に入る

「*:」で敎圢を実行するず、次のようになる。今床はコメントだけに凊理が適甚されたこずがわかる。

今床はコメントだけが敎圢されたこずを確認

「g:easy_align_ignore_groups」をその郜床蚭定するのは面倒すぎる。デフォルトの蚭定を倉曎する必芁があるケヌスはある皋床条件が決たっおいるず思うので、それに合わせお蚭定ファむルを曞いおおくのがよい。䞊蚘のように盎接「g:easy_align_ignore_groups」を倉曎しおしたうず圱響が倧きすぎるので、条件に応じおさらに絞り蟌みを行った状態の蚭定を行うのが良いだろう。詳现な蚭定方法に぀いおは、vim-easy-alignを解説する最埌の回にたずめずしお取り䞊げる予定だ。

ブロックを意識した敎圢

揃えたいデヌタは構造化されおいるこずがある。特定のブロックに入っおいるずか、すでにむンデントされおいるずいった堎合だ。䟋えば、次のようなデヌタを考えおみよう。蚭定は䞊蚘の続きで、コメントのみが敎圢の察象になっおいるずする。

凊理察象のスクリプトサンプル

この状態で「vipga→*:」ずすれば、次のように敎理が行われる。

「vipga」で凊理を開始

「→*:」で敎圢を実斜

ここで3行目に泚目したい。3行目も同じように敎理されおいるが、敎理せずに「Example:」のたた残っおおいおほしいずしよう。その堎合、凊理は簡単で、ビゞュアル遞択する察象を絞り蟌むだけでよい。䟋えば4行目にカヌ゜ルがある状態で「V20G」ずすれば、次のようにコメントの凊理したい察象だけがビゞュアル遞択の察象ずなる。

凊理したい察象をビゞュアル遞択

この状態で「→*:」ず実行するず、3行目はそのたたに、4行目以䞋のコメントデヌタを敎えられるこずがわかる。

察象だけが敎理される

「敎理する察象をビゞュアル遞択する」ずいうのはvim-easy-alignがドキュメントでも玹介しおいる方法なので、vim-easy-alignが掚奚する方法ずいうこずになるのではないだろうか。今回はスクリプトをサンプルずしお取り䞊げたが、JSONのような構造化されたデヌタに察しお、この方法はなかなか効果的なようだ。ぜひ詊しおみおいただきたい。

付録: vim-easy-alignの䞻な蚭定ず操䜜方法

操䜜 内容
ノヌマルモヌドで:EasyAlignたたはビゞュアルモヌドでga vim-easy-alignのむンタラクティブモヌドを起動する。
デフォルトのデリミタ文字 備考
空癜 = : , | . # & =は==や!=や+=ずいったように等号を含む挔算子がデリミタず認識される。
Ctrl-X 正芏衚珟 Ctrl-Xを入力するずそのあずはデリミタずしお正芏衚珟を䜿甚できる。
キヌ 内容
デリミタ 最初に䞀臎したデリミタで巊揃え。
2デリミタ 2番目に䞀臎したデリミタで巊揃え。
3デリミタ 3番目に䞀臎したデリミタで巊揃え。
-デリミタ 最埌に䞀臎したデリミタで巊揃え。
-2デリミタ 最埌から1぀前に䞀臎したデリミタで巊揃え。
-3デリミタ 最埌から2぀前に䞀臎したデリミタで巊揃え。
*デリミタ 䞀臎したすべおのデリミタで巊揃え。
**デリミタ 䞀臎したすべおのデリミタで揃え巊揃えず右揃えを亀互に適甚。
キヌ 䜍眮 内容
↩ 最初 抌すごずに右揃え、䞭倮揃え、巊揃え、右揃え、䞭倮揃え、巊揃え  ず揃えを倉曎。
ショヌトカットキヌ オプション  倀
Ctrl-F filter 文字列([gv]/.*/?)
Ctrl-I indentation shallow、deep、none、keep
Ctrl-L left_margin 数字たたは文字列
Ctrl-R right_margin 数字たたは文字列
Ctrl-D delimiter_align left、center、right
Ctrl-U ignore_unmatched 0、1
Ctrl-G ignore_groups [], [‘String’], [‘Comment’], [‘String’, ‘Comment’]
Ctrl-A align 文字列(/[lrc]+\*{0,2}/)
← stick_to_left { ‘stick_to_left’: 1, ‘left_margin’: 0 }
→ stick_to_left { ‘stick_to_left’: 0, ‘left_margin’: 1 }
↓ *_margin { ‘left_margin’: 0, ‘right_margin’: 0 }

付録: 䜿っおいる蚭定ファむルずセットアップ方法

プラグむンを䜿うためにDeinをセットアップする方法

mkdir -p ~/.cache/dein
cd ~/.cache/dein/
curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
sh ./installer.sh .
rm ./installer.sh

本連茉で䜿っおいる~/.vimrcファむル

"dein Scripts=============================
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath+=~/.cache/dein/./repos/github.com/Shougo/dein.vim

" Required:
if dein#load_state('~/.cache/dein/.')
  call dein#begin('~/.cache/dein/.')

  " Let dein manage dein
  " Required:
  call dein#add('~/.cache/dein/./repos/github.com/Shougo/dein.vim')

  " Add or remove your plugins here
  call dein#add('junegunn/seoul256.vim')
  call dein#add('vim-airline/vim-airline')
  call dein#add('vim-airline/vim-airline-themes')
  call dein#add('preservim/nerdtree')
  call dein#add('tpope/vim-commentary')
  call dein#add('tpope/vim-fugitive')
  call dein#add('fholgado/minibufexpl.vim')
  call dein#add('dense-analysis/ale')
  call dein#add('junegunn/fzf', {'build': './install --all'})
  call dein#add('junegunn/fzf.vim')
  call dein#add('sheerun/vim-polyglot')
  call dein#add('junegunn/vim-easy-align')

  " Required:
  call dein#end()
  call dein#save_state()
endif

" Required:
filetype plugin indent on
syntax enable

" If you want to install not installed plugins on startup.
if dein#check_install()
  call dein#install()
endif

" seoul256
let g:seoul256_background = 233
colo seoul256

" vim-airline
let g:airline_powerline_fonts = 1
let g:airline_theme = 'molokai'

" NERDTree
"  <C-o> open NERDTree
nnoremap <silent> <C-o> :NERDTreeToggle<CR>

" minibufexpl
nnoremap <silent> bn :<C-u>:bnext<CR>
nnoremap <silent> b1 :<C-u>:b1<CR>
nnoremap <silent> b2 :<C-u>:b2<CR>
nnoremap <silent> b3 :<C-u>:b3<CR>
nnoremap <silent> b4 :<C-u>:b4<CR>
nnoremap <silent> b5 :<C-u>:b5<CR>
nnoremap <silent> b6 :<C-u>:b6<CR>
nnoremap <silent> b7 :<C-u>:b7<CR>
nnoremap <silent> b8 :<C-u>:b8<CR>
nnoremap <silent> b9 :<C-u>:b9<CR>

" fzf
nnoremap <silent> fzf :Files<CR>
nnoremap <silent> ls :Buffers<CR>

" vim-easy-align
xmap ga <Plug>(EasyAlign)
nmap ga <Plug>(EasyAlign)

"End dein Scripts=========================

set number
syntax on
set whichwrap=b,s,[,],<,>,~,h,l
set cursorline
set incsearch
set hlsearch
set ignorecase