junegunn/vim-easy-alignプラグインを使うことで、かなり自由度高くテキストデータを表形式に変換することができる。これまでは基本的な操作方法を取り上げてきたが、junegunn/vim-easy-alignプラグインでは列ごとのアラインはもちろん、デリミタまでの空白数、インデントの扱い、正規表現によるデリミタの指定など、より細かい指定も可能だ。これらを全て使うと、限りなく自分の思い描くかたちに近い表を作ることができる。
junegunn/vim-easy-alignプラグインは、デリミタごとにデフォルト設定を行える。これにVimのファイル形式ごとの設定機能を結び付ければ、「あるファイルのあるデリミタに関してはこのルールで表を整える」といった設定を行うことができる。欲しい表形式は特定のデータに対して特定の形式であることが多く、設定さえしてしまえば整形作業が一発で終わるようになるのだ。これこそ、junegunn/vim-easy-alignプラグインの真骨頂と言える。
今回は特に多用することになるだろう「列ごとのアラインを指定する方法」を紹介する。
アライン指定の基本
今回、次のようなデータを用意した。/etc/passwdのデリミタを「:」から「|」に変更したものだ(表として認識するには、デリミタが「|」のほうがわかりやすいので変更した)。
junegunn/vim-easy-alignプラグインの機能を使ってこのデータを表形式に整えてみよう。これまでのように「vipga*|」で整形すれば次のようになる。
この整形の段階で、列ごとにアラインを指定することができる。まず、「vipga」まで入力したら「Ctrl」+「A」を押す。
すると、次のようにコマンドラインが列ごとのアラインを指定する状態になる。
左、中央、右のアラインをそれぞれ「l」「c」「r」で指定する。
例えば上記スクリーンショットの場合、「rlllrr」と入力しており、これで1列目から右寄せ、右寄せ、左寄せ、左寄せ、左寄せ、右寄せ、右寄せ、という指定を行ったことになる。最後の列は指定を行っていないのでデフォルトの値(左寄せ)が使われる。
アラインを入力してエンターキーを押すと、次はデリミタの入力を求められる。ここでのデリミタは「|」なので「|」と「Enter」キーを入力する。
実行すると次のように指定した寄せ方で表が整理されることがわかる。
アラインを好きな方向に指定できるようになると、かなり自由に表を整えられる。この方法はインタラクティブに整理する方法としても便利なので、頻用する機能としてマスターしておいても悪くないと思う。
アライン指定 繰り返し指定と応用
それではもうちょっと高度な例を見ていこう。例えば、次のスクリーンショットは「vipga*」+「Ctrl」+「Ar」+「↩️|↩️」と入力した場合の結果だ(実際にはデフォルト値の「l」を削除するために「vipga*」+「Ctrl」+「A」+「backspace」+「r」+「↩️|↩️」となるのだが、意味がわかりにくくなるので、試す場合には前述の表記を見つつ、必要に応じてデフォルト値を削除して入力してほしい)。
まず、「Ctrl」+「Ar」の入力前に「*」を入力しているのが一つのポイントとなる。この指定で最後に指定したアラインが繰り返されることになる。「r」+「↩️」になっているから、1列目から全部右寄せという指定になる。
「*」は最後の指定の繰り返しで、「**」は全ての指定を繰り返すという意味になる。次に示す画像は「vipga**」+「Ctrl」+「A」+「c」+「r」+「↩️|↩️」の実行結果だ。整形されたデータが中央寄せ、右寄せ、中央寄せ、右寄せ、中央寄せ、右寄せ……といったように、アラインの指定全てが繰り返されていることがわかる。
次は「vipga**」+「Ctrl」+「A」+「r」+「c」+「l」+「↩️|↩️」という処理の実行結果だ。「rcl」という指定が繰り返し行われていることがわかる。
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