これまでjunegunn/vim-easy-alignプラグインの主な機能を取り上げてきた。残るはインデントとフィルタリングだ。これらの機能について説明すれば、同プラグインが提供する整形機能はほぼ紹介しきったことになる。

「データを表形式にする」と言うと、基データはCSVのようなデータ形式であることを想定するかもしれない。だが、人間がメモや整理のために記述したテキストデータなどの場合、インデントが使われているケースもある。junegunn/vim-easy-alignプラグインならば、こうしたインデント付きのデータも整えることができる。

インデント機能

まず、製品とその価格をまとめたテキストデータを表形式に整えるケースを考えてみよう。ご覧の通り、インデントを使って製品のシリーズごとに何となくグループ分けされたデータになっている。

今回の整形対象データ

まず、「ggvG」を実行して整形するデータを選択する。「ggvG」は、「(パラグラフではなく)ファイル全体をビジュアル選択する」という意味になる。

「ggvG」で全データを選択

「ga」でjunegunn/vim-easy-alignプラグインの整形モードに入る。

「ga」でEasyAlignを起動

ここでデリミタとして「:」を入力すれば、次のように整形される。注目してほしいのは、インデントがそのまま残っていることだ。junegunn/vim-easy-alignはデフォルトではインデントをそのまま保持するのである。

インデントをそのまま残した整形

インデントの調整にはいくつかのオプションが用意されている。まず、「ggvGga」で全選択の後に、EasyAlignの機能を実行する。

準備完了

この状態で「Ctrl」+「I」と入力すると、次のスクリーンショットのようにインデントの指定が「shallow」に変わる。

「shallow」で浅めのインデント指定

「shallow」は「浅めのインデント」という指定だ。この状態でデリミタを入力すると、次のように行の先頭のインデントが浅めに変更されることを確認できる。

浅めのインデントで整形済み

「Ctrl」+「I」を2回入力すると、今度は指定が「deep」になる。「深めのインデントを行う」という意味だ。

「deep」で深めのインデント

実行すると次のようになる。インデントが深くなっていることがわかるだろう。

深めのインデントで整形済み

「Ctrl」+「I」を3回入力すると、今度は次のように指定が「none」になる。「インデント」をなくすという意味だ。

「none」は「インデントなし」の指定

実行すると次のようになる。インデントがなくなっていることがわかる。

インデントなしで整形済み

このように、表形式への整形をしつつ、インデントも制御できる。使い方を覚えてしまえば、かなり便利な機能だ。

フィルタリング機能

junegunn/vim-easy-alignプラグインではビジュアル選択したデータに対して整形処理をするわけだが、さらにフィルタリング機能を使うことで処理対象を絞り込める。これを活用すると、もう少しごちゃごちゃしたデータでも整形しやすくなる。

例えば、先ほどのデータをちょっと変更して、次のようなデータを整形するケースを考えてみよう。

フィルタリングを試すデータ

「SERIES:」から始まる行はコメントやタイトル的な意味合いがあるのだが、「ggvGga:」で整形すると、次のように価格データの行と同じように整形処理されてしまう。

「ggvGga:」による整形結果

フィルタリング機能を使うと、この行を処理対象から外すことができるのだ。フィルタリングは「Ctrl」+「F」で指定する。「ggvGga」の後に「Ctrl」+「F」と入力すれば、次のようにフィルタを指定する状態になる。

「Ctrl」+「F」でフィルタを指定

フィルタは「g/パターン/」または「v/パターン/」で指定する。ここでは「g/^[^S]/」のように指定して、「S」から始まる行を処理の対象から抜いている。

フィルタとして「g/^[^S]/」を指定

デリミタを指定して整形すると、「SERIES:」から始まる行が処理対象から外れたことを確認できる。

「SERIES:」から始まる行が対象から外れていることがわかる

フィルタリング機能を使うことで、さらなる絞り込みができた。これまで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