matchit.vim で Ruby のブロックをカーソル移動

目次

対応する括弧へのカーソル移動

Vim では、% キーで対応する括弧にカーソルを移動させることができる。

のだけど、Ruby の doend のブロックなどは % ではカーソル移動できなくて不便に思っていた。

matchit.vim

Vim のヘルプで % の説明を読むと、matchpairs オプションで開始・終了のペアを変更することができるとある。 しかし、このオプションで指定できる開始・終了の要素は 1 文字のもので、たとえば beginend は指定することができない。

ヘルプを読み進めると、他の項目については matchit プラグインが使えると書かれている。

matchit プラグインは $VIMRUNTIME/macros/matchit.vim にあるが、デフォルトでは有効になっていない。 matchit のヘルプファイル $VIMRUNTIME/macros/matchit.txt を読むと、b:match_wordsbeginend などの単語を指定することができるようだ。

Ruby の場合はちょっと工夫が必要

実際に試してみると、Ruby の場合は end がさまざまなブロックの終端として共通しているため、単純にペアを別々に指定すると end から対応する開始位置に戻れないことがわかった。

カーソルが end にある状況で % を押下した際に、指定したどのペアのものか判断がつかないのだろう。

幸い b:match_words には正規表現を指定することができるので、複数のペアではなく単一のペアとして指定することで期待する動作を得ることができた。

matchit.vim の設定

ということで、以下のような設定となった。

source $VIMRUNTIME/macros/matchit.vim
augroup matchit
  au!
  au FileType ruby let b:match_words = '\<\(module\|class\|def\|begin\|do\|if\|unless\|case\)\>:\<\(elsif\|when\|rescue\)\>:\<\(else\|ensure\)\>:\<end\>'
augroup END