本連載では、これまでテキストデータを表形式に整える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