マージン、寄せ、両詰め

今回はjunegunn/vim-easy-alignプラグインで表作成の調整を行う方法としてデリミタの左マージン、右マージン、デリミタの左寄せ、右寄せ、デリミタの左右詰め、の仕方を取り上げる。これらの調整は、最終的には設定ファイルに落とし込む。覚えられるなら操作方法を覚えてしまえばよいが、細かい調整方法は忘れてしまうものだ。とりあえずどのような指定が可能かだけ知っておき、後は設定ファイルで細かく設定して使えるようになればよいだろう。

今回使用するサンプルデータは次の通りだ。/etc/passwdのデリミタを「:」から「|」へ置換したものを使用する。やはり、デリミタは「|」のほうが表として人間が認識しやすい。

使用するサンプルデータ

例えば、この状態で「vipga*|」と実行すれば次のようになる。

「vipga*|」で表形式へ整えたところ

この表をベースに、どのような調整ができるか紹介していこう。

デリミタの左マージン

デリミタに関してはいくつかの調整ができるようになっている。その一つがデリミタの左右のマージンの指定だ。まず、デリミタの左のマージンを指定する方法を説明しよう。

まず、「vipga*」で全体選択と繰り返し指定を行う。

「vipga*」の実行結果

ここで「Ctrl」+「L」とショートカットキーを入力する(以降の操作は基本的にこれだ。「vipga*」まで入力して、その後、ショートカットキーを入力して調整や指定を行う)。「Ctrl」+「L」が「デリミタの左マージンの設定」という指定になっている。

「Ctrl」+「L」で、左マージン数を指定するプロンプトが表示される

今回はここで「0」と入力してマージンを削除する。

「0」と入力するとマージンがなくなる

最後にデリミタとして「|」を指定する。

デリミタとして「|」を指定して実行する。左マージンがなくなっていることを確認できる

整形後を見てみると、デリミタの左側のマージンがゼロになっていることを確認できる。セルごとに長さが違うのでわかりにくいが、セルから見ればセルの右側、デリミタからすれば左側がくっついている。これがデリミタの左マージンの指定だ。

デリミタの右マージン

同じように操作して、「Ctrl」+「L」と入力する部分を「Ctrl」+「R」に変えると右マージンの指定となる。次のスクリーンショットは先ほどの操作の「Ctrl」+「L」の部分を「Ctrl」+「R」に置き換えただけのものだ。デリミタの右側のマージンが0になったことを確認できる。

「vipga*」+「Ctrl」+「R」+「0」+「↩️||↩️」の実行サンプル

マージンを「3」に変更して実行すると次のようになる。

「vipga*」+「Ctrl」+「R」+「3」+「↩️||↩️」の実行サンプル

今回のデータではデリミタの右側は値が揃っているのでわかりやすい。デリミタの右側のマージンが空白3つ分になっている。

デリミタの左詰め

デリミタをセルの値へピッタリ付けることもできる。まずは実行結果をみてみよう。「vipga*」+「←」+「|」のように実行すると、次のように指定したデリミタがセルの右端へぴったり付くようになる。

「vipga\*」+「←」+「|」の実行サンプル

表というよりも、2値の表示を整理する場合にはこの指定が便利だ。

デリミタの右詰め

「デリミタの右詰め」と言うとやや語弊がある。より正確に言うならば、先ほどの「デリミタの左詰め」をニュートラルな状態に戻すのがこの操作だ。先の操作で「←」と入力した部分を「→」と入力することで機能する。実行すると次のようになる。

「vipga*」+「→」+「|」の実行サンプル

この指定は要するにデフォルトの状態にするものなので、明示的に操作する機会はあまりないかもしれないが、「反対の操作(ニュートラルな状態に戻す操作)がある」ということを知っておくとよいかと思う。

デリミタの両詰め

デリミタの左マージンと右マージンを両方とも「0」にする指定方法も用意されている。先ほどまでの操作で「←」または「→」を入力していた部分を「↓」にすることで機能する。「vipga*」+「↓」+「|」の実行結果は、次の通りだ。

「vipga\*」+「↓」+「|」の実行サンプル

テキストを表形式にしたい場合、表示幅に制限があることも多い。そうした場合に、このように詰めて整理する方法は便利だろう。

細かい調整をマスターして見やすい表へ整える

テキストデータを表形式にする目的の一つは、見やすくするためだ。当然、セルの左/中央/右寄せの調整やデリミタのマージン設定、寄せ/詰めの設定を行いたくなる。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