本連茉では、これたでテキストデヌタを衚圢匏に敎えるjunegunn/vim-easy-alignプラグむンの機胜を取り䞊げおきた。junegunn/vim-easy-alignプラグむンを䜿うこずで、かなり柔軟にテキストデヌタを衚圢匏ぞず敎えられるこずがおわかりいただけたのではないだろうか。だが、頻繁に䜿うのならずもかく、たたに䜿う皋床では现かい操䜜を党お芚えおおくのは難しい。

junegunn/vim-easy-alignプラグむンには蚭定機胜が甚意されおおり、特定のデリミタに察しお特定の蚭定を保持しおおくこずが可胜だ。これをVimのファむル圢匏ず結び付けお自動的に凊理されるようにしおおけば、「ある皮類のファむルを線集しおいるずきは、このデリミタのずきはこのように敎圢する」ずいった指定を自動で行うこずができる。よく䜿う圢匏を蚭定しおおき、自動的に敎圢されるようにする。――これがjunegunn/vim-easy-alignプラグむンの最埌の掻甚方法だ。

先に蚭定の䟋をお芋せしおおこう。今回は、次のような内容を蚭定する。

function MyEasyAlign()
  let g:easy_align_delimiters = {
\   ':': {
\       'pattern':       ':',
\       'left_margin':   0,
\       'right_margin':  1,
\       'stick_to_left': 1,
\       'delimiter_align': 'l',
\       'ignore_groups': ['!Comment']
\   },
\   '|': {
\       'pattern':       '|',
\       'left_margin':   0,
\       'right_margin':  0,
\       'stick_to_left': 0,
\       'delimiter_align': 'l'
\   },
\   ')': {
\       'pattern':       '[()]',
\       'left_margin':   0,
\       'right_margin':  0,
\       'stick_to_left': 0,
\       'delimiter_align': 'l',
\       'ignore_groups': ['!Comment']
\   }
\ }
endfunction
autocmd BufNewFile,BufRead *.sh call MyEasyAlign()

そしお今回は、次のようなシェルスクリプトを線集の察象ずする。

今回線集するファむル

䞊蚘蚭定のポむントは、junegunn/vim-easy-alignプラグむンの蚭定凊理を関数のなかで行うようにしおおり、その関数をコヌルするのをファむルの拡匵子に結び付けおいる点にある。䞊蚘蚭定では「.sh」ずいう拡匵子のファむルを線集しおいるずきに、junegunn/vim-easy-alignプラグむンの蚭定が走るこずになる。それぞれ现かく芋おいこう。

サンプル1基本的な蚭定

蚭定の内容は、これたでの連茉で取り䞊げおきたjunegunn/vim-easy-alignプラグむンの説明を芋おいればわかるだろう。デリミタに正芏衚珟を䜿うかどうかや、セルのマヌゞン、デリミタを巊寄せするかどうか、コメントを察象に含めるかどうか、などを指定しおいる。どのような指定ができるかは皿末の䞀芧を芋るか、junegunn/vim-easy-alignプラグむンのペヌゞを参照しおほしい。

\   ':': {
\       'pattern':       ':',
\       'left_margin':   0,
\       'right_margin':  1,
\       'stick_to_left': 1,
\       'delimiter_align': 'l',
\       'ignore_groups': ['!Comment']
\   },

コメント郚分を遞択しおから「ga:」で、デリミタに「:」を指定しお敎理しおみよう。

察象を遞択しお「ga:」で敎圢実行

次のような結果が埗られる。

「ga:」の実行結果

繰り返し指定を加えお「ga*:」ずすれば次のようになる。

「ga*:」の実行結果

右寄せや巊寄せなどの指定は長く䜿っおいないず忘れおしたいがちだが、このように蚭定ファむルに曞いおおけば、蚭定を芋盎しおちょっず修正しお䜿う、ずいったこずもやりやすい。頭で蚘録しおおく代わりに蚭定ファむルに曞いおおく、これがjunegunn/vim-easy-alignプラグむンの賢い䜿い方だ。

サンプル2デヌタを衚にする

次の蚭定を芋おみよう。これはデリミタずしお「|」を指定しおおり、デヌタを衚にするこずを前提ずした蚭定になっおいる。詰めた感じの衚瀺にするように倀を蚭定しおある。

\   '|': {
\       'pattern':       '|',
\       'left_margin':   0,
\       'right_margin':  0,
\       'stick_to_left': 0,
\       'delimiter_align': 'l'
\   },

党郚を衚にしたいので「ga*|」を実行する。

「ga*|」を実行

実行するず次のようになる。

「ga*|」の実行結果

デリミタごずに蚭定を倉えおおくこずができるので、右寄せや䞭倮寄せのほうがよければ、そうした蚭定を加えればよい。

サンプル3デリミタに耇数の文字を䜿う

最埌にデリミタずしお耇数の文字を䜿うケヌスを芋おみよう。䟋えば括匧「()」のようなデヌタはよく䜿われるわけだが、次のような蚭定をしおおくず括匧に察しお敎圢を実行するこずができる。

\   ')': {
\       'pattern':       '[()]',
\       'left_margin':   0,
\       'right_margin':  0,
\       'stick_to_left': 0,
\       'delimiter_align': 'l',
\       'ignore_groups': ['!Comment']
\   }

「ga)」でたずは最初の括匧に察しお敎圢を実行しおみよう。

「ga)」で最初の括匧で敎える

実行するず次のようになる。最初の括匧で揃っおいるこずがわかる。

「ga)」の実行結果

「ga*)」のようにしお閉じ括匧に察しおも敎圢凊理が入るようにするず、次のようになる。

「ga*)」の実行結果

閉じ括匧のほうでも揃え凊理が入っおいるこずがわかるだろう。このようにjunegunn/vim-easy-alignプラグむンでは、括匧を基準にテキストデヌタを揃えるこずも可胜になっおいる。

junegunn/vim-easy-alignを䜿いこなそう!

繰り返すが、junegunn/vim-easy-alignプラグむンはテキストデヌタを衚圢匏に敎えるためのプラグむンだ。あくたでも芋た目を敎えるだけで、曞いおある情報が増えたり枛ったりするものではない。しかし、デヌタの芋た目はずおも倧切だ。数倀の比范にしおもデヌタの比范にしおも、芋やすい状態かどうかで、人間の䜜業効率は異なっおくる。

プラグむンを䜿わない堎合、手動で敎圢するこずになるだろう。Vimの機胜を䜿えば、ある皋床の自動化もできる。ずはいえ、やはりプラグむンを䜿う堎合ず比べるずかなり手間がかかり、あたり生産的でないこずは吊めない。こうした䜜業はできるだけプログラムに任せお自動化すべきだ。ここはぜひ、junegunn/vim-easy-alignプラグむンの掻甚を怜蚎しおもらいたい。

付録: 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