これまでjunegunn/vim-easy-alignプラグインを使い、テキストデータに対してデリミタを指定して表形式へ整理する方法を取り上げてきた。これまでは暗黙の了解としてデリミタは1文字だったが、実はjunegunn/vim-easy-alignではデリミタとして正規表現を指定することもできる。データを表形式に整える場合、デリミタに正規表現を使いたくなるようなケースはあまりないだろう。しかし、2値データの整理や、不等号を含む比較データなどでは正規表現によるデリミタの指定が必要になることもある。

今回は、この正規表現によるデリミタの指定機能を説明するためのサンプルとして、次のようなテキストデータを使用する。

今回のサンプルデータ

いくつかの不等号が含まれているが、これを正規表現で指定してデリミタとして使用する。

デリミタとして正規表現を使うのであれば、デリミタそのものの「寄せ」についても知っておきたい。これまでデリミタの左右のマージンや、デリミタの左右のセルの寄せについては解説した。junegunn/vim-easy-alignでは、デリミタそのものの寄せも指定することができる。これは、正規表現を指定すると、デリミタの長さが合わないケースが生じるからだ。

正規表現指定は Ctrl-X

まず、次のように「vipga」で処理対象データを選択する。

「vipga」で対象を選択し、junegunn/vim-easy-alignの処理対象とする

この状態で「Ctrl」+「X」と入力すると、デリミタの指定が正規表現に切り替わる。

「Ctrl」+「X」でデリミタ指定を正規表現へ切り替え

ここでは正規表現として「<[-=]*」と指定している。この指定で今回のサンプルデータの不等号をカバーすることができる。

正規表現でデリミタを指定

この状態で「Enter」キーを押して実行すると、次のように1つ目のデリミタでデータが整理される。

正規表現で1つ目のデリミタで整理

「Ctrl」+「X」を入力する前に繰り返し指定の「*」を入れておけば、次のように2つ目のデリミタに対しても同じように整理が行われる。これが正規表現を使った指定の基本的な使い方だ。

繰り返し指定でデータ全体を整理

デリミタを正規表現で指定すると、デリミタが異なるケースでも同じように整理することができる。使いこなせるようになれば、定形ではないデータを表っぽく整えることも可能だ。

デリミタの寄せ指定は 「Ctrl」+「D」

先ほどのサンプルを見るとわかると思うが、デリミタそのものは右寄せでそろっている。これは次のように、対象を選択してから「Ctrl」+「D」を入力したのと同じ状態だ。

デリミタ指定も行う場合は「Ctrl」+「D」を使う

コマンドラインに「’da’: ‘left’」という文字が表示されていることがわかるだろう。これはデリミタ寄せ(delimiter-align: da)を左(left)にすることを意味する。ここでさらに「Ctrl」+「D」を入力すると、次のようになる。「’left’」が「’center’」になったことがわかるだろう。

さらに「Ctrl」+「D」を押す

さらに次のように「Ctrl」+「D」を入力すると、「’center’」が「’right’」になる。これで戻ってきたことになる。

さらに「Ctrl」+「D」を押す

この状態で「Ctrl」+「X」を入力し、デリミタを正規表現で指定する。

デリミタ寄せを指定した後で正規表現でデリミタを指定

次のようにデリミタは右寄せでそろうことになる。

デリミタ右寄せサンプル

デリミタを中央寄せにしておけば次のようになる。

デリミタ中央寄せサンプル

デリミタを左寄せにしておけば次のようになる。

こんな感じでデリミタを位置を左/中央/右と調整することができる。細かい指定ではあるのだが、一見して判別しやすいテキストベースの表を作るとなると、こういった細かい調整が欠かせない。とは言え、手動で行うのは時間の無駄だ。プラグインの機能を駆使してサクッと終わらせてしまおう。

vim-easy-alignプラグインは細かいこともできる

テキストデータを表形式に変換するプラグインはいくつもあるが、なかでもjunegunn/vim-easy-alignプラグインはシンプルな指定から複雑で細かい指定まで幅広く対応している。こうした機能の豊富さやインタラクティブに変更できる使いやすさが、人気がある理由の一つなのではないかと思う。

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