これまでjunegunn/vim-easy-alignプラグインを使い、テキストデータに対してデリミタを指定して表形式へ整理する方法を取り上げてきた。これまでは暗黙の了解としてデリミタは1文字だったが、実はjunegunn/vim-easy-alignではデリミタとして正規表現を指定することもできる。データを表形式に整える場合、デリミタに正規表現を使いたくなるようなケースはあまりないだろう。しかし、2値データの整理や、不等号を含む比較データなどでは正規表現によるデリミタの指定が必要になることもある。
今回は、この正規表現によるデリミタの指定機能を説明するためのサンプルとして、次のようなテキストデータを使用する。
いくつかの不等号が含まれているが、これを正規表現で指定してデリミタとして使用する。
デリミタとして正規表現を使うのであれば、デリミタそのものの「寄せ」についても知っておきたい。これまでデリミタの左右のマージンや、デリミタの左右のセルの寄せについては解説した。junegunn/vim-easy-alignでは、デリミタそのものの寄せも指定することができる。これは、正規表現を指定すると、デリミタの長さが合わないケースが生じるからだ。
正規表現指定は Ctrl-X
まず、次のように「vipga」で処理対象データを選択する。
この状態で「Ctrl」+「X」と入力すると、デリミタの指定が正規表現に切り替わる。
ここでは正規表現として「<[-=]*」と指定している。この指定で今回のサンプルデータの不等号をカバーすることができる。
この状態で「Enter」キーを押して実行すると、次のように1つ目のデリミタでデータが整理される。
「Ctrl」+「X」を入力する前に繰り返し指定の「*」を入れておけば、次のように2つ目のデリミタに対しても同じように整理が行われる。これが正規表現を使った指定の基本的な使い方だ。
デリミタを正規表現で指定すると、デリミタが異なるケースでも同じように整理することができる。使いこなせるようになれば、定形ではないデータを表っぽく整えることも可能だ。
デリミタの寄せ指定は 「Ctrl」+「D」
先ほどのサンプルを見るとわかると思うが、デリミタそのものは右寄せでそろっている。これは次のように、対象を選択してから「Ctrl」+「D」を入力したのと同じ状態だ。
コマンドラインに「’da’: ‘left’」という文字が表示されていることがわかるだろう。これはデリミタ寄せ(delimiter-align: da)を左(left)にすることを意味する。ここでさらに「Ctrl」+「D」を入力すると、次のようになる。「’left’」が「’center’」になったことがわかるだろう。
さらに次のように「Ctrl」+「D」を入力すると、「’center’」が「’right’」になる。これで戻ってきたことになる。
この状態で「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