読者です 読者をやめる 読者になる 読者になる

もた日記

くだらないことを真面目にやる

Vimメモ : vim-easy-alignでテキスト整形

Vim

テキスト整形


github.com

vim-easy-alignというプラグインを使えば、例えば以下のテキストを

Paul,McCartney,1942
George,Harrison,1943
Ringo,Starr,1940
Pete,Best,1941

以下のように簡単にテキスト整形できる。

Paul,   McCartney, 1942
George, Harrison,  1943
Ringo,  Starr,     1940
Pete,   Best,      1941


vim-easy-alignのインストール


NeoBundleの場合は下記行をvimrcに追加。

NeoBundle 'junegunn/vim-easy-align'


基本的な使い方


下図は基本的な使い方のフローだが、ビジュアルモードでテキストを選択後にgaキーを入力、その後テキスト整形のルールを入力して整形するのが簡単そう。

f:id:wonder-wall:20160328224719p:plain


まず、gaでEasyAlignを起動するように下記設定をvimrcに追加する。

" Start interactive EasyAlign in visual mode (e.g. vipga)
xmap ga <Plug>(EasyAlign)
" Start interactive EasyAlign for a motion/text object (e.g. gaip)
nmap ga <Plug>(EasyAlign)



冒頭の例で説明すると、Shift+vの行選択ビジュアルモードで対象行となる4行を選択してからgaキーを入力すると、Vimコマンドラインに以下のようなコマンドが表示される。

:EasyAlign (_)

その後、続けて*,と入力すればテキスト整形される。
ここで*,の意味だが、2文字目の,はデリミタを表す。例えば元の文字列が,ではなく|で句切られていたとすれば、*|と入力すればよい。
デリミタとしてデフォルトで定義されているものは<Space>, =, :, ., |, &, #, ,である。

1文字目の*は何番目のデリミタに対してテキスト整形を適用するかを表す。*は全てを対象にするが、1,と入力すれば(デフォルトでは1なので,だけでもよい)、

Paul,   McCartney,1942
George, Harrison,1943
Ringo,  Starr,1940
Pete,   Best,1941

のように1番目の,に対してのみ整形され、2,と入力すれば

Paul,McCartney,  1942
George,Harrison, 1943
Ringo,Starr,     1940
Pete,Best,       1941

のように2番目の,に対してのみ整形される。
それ以外には-,で後ろから数えて1番目を対象、-2,で後ろから数えて2番目を対象のような指定もできる。
また**,という指定もあり、この場合は左寄せ、右寄せが交互にテキスト整形される(使い所がよくわからないが)。

Paul,   McCartney, 1942
George,  Harrison, 1943
Ringo,      Starr, 1940
Pete,        Best, 1941


整形オプション


ga入力後、デリミタを入力する前に以下のような整形オプションを指定できる(オプションの詳細は元ページに詳しく書いてある)。

キー オプション 説明
CTRL-F filter g/../でマッチ行のみ対象。v/../はマッチ行以外
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}/)
<Left> stick_to_left デリミタを左寄せ
<Right> stick_to_left デリミタを右寄せ
<Down> ∗_margin デリミタ周辺のマージンなし
<Enter> left/right/center整形モードの切り替え

<Left>などは矢印キー

Live Interactiveモード


上記の整形オプションは実際に確認してみないとわからないことが多く、何度も結果を確認するのも大変なのでLive Interactiveモードを使用するのがよい。
Live Interactiveモードへはgaを入力後に<C-p>を押すことで移行でき、コマンドラインの表示が以下のように変わる。

:LiveEasyAlign (_)

Live Interactiveでは整形オプションなどがリアルタイムで反映されるので自分の意図した結果になるのかが確認しやすい。注意点として、Live Interactiveモードを終了するためにはデリミタを2回入力する必要がある。

正規表現


デリミタとして正規表現を使用することも可能。デリミタ入力前に<C-/><C-x>を押すとコマンドラインの表示が以下のようになる。

Regular expression:

ここで例えば[0-9]を入力すれば、以下のように数値をデリミタとして整形できる。

Paul,   McCartney, 1  9  4  2
George, Harrison,  1  9  4  3
Ringo,  Starr,     1  9  4  0
Pete,   Best,      1  9  4  1

実践Vim 思考のスピードで編集しよう!

実践Vim 思考のスピードで編集しよう!