Vim の snippet 系プラグインを使う際のTips

vim で動作する snippet 系のプラグインの多くは、snippetを展開したり次の入力箇所にジャンプした際に変更すべき部分を選択するようになっている。

で、大抵のプラグインではこの時選択モード(Select mode)で選択されている。これはビジュアルモードとは少し違う。
詳細は省略するが、簡単に言ってしまえば一般的なテキストエディタでの選択をエミュレートするためのモードだ。印字可能な文字を入力すると、選択部分が消え、入力した文字が挿入され、挿入モードに移行する。
このモードを使うことで変更すべき部分を変更しやすくしているのだけど、印字可能キーを押したのに挿入モードに入らない!なんて経験はないだろうか。例えば、 j を押したら普通にカーソルが下に移動したぞ!とか。
そういう人は多分 vimrc に↓みたいなのを書いてる。(例)

noremap j gj

普通に noremap すると、ノーマルモードやビジュアルモードなどのキーマッピングが同時に設定されるが、素直にビジュアルモードにキーマッピングを設定するとセレクトモードにも同時に設定される。ビジュアルモードのみでセレクトモードに設定しないようにするには、 xmap 系のコマンドを使う必要がある。つまりこう。

nnoremap j gj
onoremap j gj
xnoremap j gj

…面倒くさすぎる。普通に考えてこんなのいくつもやってられない。しかもプラグインがビジュアルモードにキーマッピング作ったら結局意味がない。
実はもっと簡単にやる方法がある。逆に考えるんだ。全部設定した後セレクトモードのキーマッピングを消してしまえばいいんだ!
以下、snipMate.vim での私の設定。

augroup vimrc-plugin-snipMate
  autocmd!
  autocmd VimEnter,BufEnter * call s:snipMate_remap()
augroup END
function! s:snipMate_remap()
  smapclear
  smapclear <buffer>
  snoremap <silent> <Tab> <ESC>a<C-r>=TriggerSnippet()<CR>
endfunction

なんかバッファに入る度に几帳面に消してるけど、ここまでやる必要は多分ない。VimEnter だけで十分。
セレクトモードを全部消しちゃうと必要なものも消えちゃうけど、元々セレクトモードで必要なものなんて殆どない。ここでは snipMate.vim が設定しているものを再設定しているのみ。snipMate.vim 以外を使っている場合はそれに合わせて適時修正する。
こうしておけば普段通り noremap や vnoremap を使っていれば問題ないようになるよ。やったね!