basyura's blog

あしたになったらほんきだす。

snippet

スニペット(snippet)とは、「断片」という意味である。情報処理の分野ではよく使う短いプログラムコードを統合開発環境から呼び出す機能の事である。 また、呼び出される短いコードの事をスニペットと呼ぶ場合もある。

スニペット - wikipedia

neocomplcache は補完だけと思われがちですが、強力な snippet も装備しています。例えば、

snippet     s
abbr        ''
    '${1}'

と定義しておけば、s の後に (neocomplcache_snippets_expand) を呼び出すと '' に展開されます。${1} は展開後のカーソル位置になります。
これだけだと余りありがたみが分かりませんが、はてな記法であるとか、タイプ数が多いもの、決まりきったテンプレートなど「これはさっきも書いたな」と思うものを書きためていくと便利すぎて無くてはならないものになります。
僕の場合、はてな記法だと以下をよく使っています。

snippet pre
abbr    >|| ||<
prev_word   '^'
    >|${1}|
    ${2}
    ||<

snippet bl
abbr    >> <<
prev_word   '^'
    >${1}:title=${2}>
    ${3}
    <<

snippet     title
abbr        *[ ]
prev_word   '^'
    *[${1}] ${2}

snippet     twitter
abbr        twitter:99999:detail
    [twitter:${1}:detail]

設定

" スニペットを展開するためのキー
imap <silent> <C-l> <Plug>(neocomplcache_snippets_expand)
" 自分定義の snippet を保存するディレクトリ
let g:neocomplcache_snippets_dir='~/.vim/snippets'
" snippet ファイル編集コマンド
command! -nargs=* Nes NeoComplCacheEditSnippets <args>

デフォルトで幾つか snippet が用意されていますが、自分用を定義したい場合は保存先を指定しておきます。
また、:Nes で開いているファイルの filetype に該当する snippet 定義を編集できるようにしています。正式なコマンド名は長いので短くしています。結構便利です。

デフォルトの snippet を消す

デフォルトで用意されているんだけど展開してほしくない場合など、消したい snippet がある場合は delete を使います。

delete r
delete in

文脈によって展開する snippet を切り替える

今日知って「これはすごいなー」と思ったもの。
例えば erb ファイルを編集している場合は、filetype の eruby に対応する snippet を補完候補に表示して展開してくれます。ところが、scriptlet な部分に入ると ruby の snippet を展開してくれます。filetype だけじゃないんです。
| をカーソル位置とすると

<li>link_to|
↓ eruby の snippet から展開
<li><%= link_to "|" , ${2:path} %>
<li><%= link_to "a|" , ${2:path} %>
↓ ruby の snipeet から展開
<li><%= link_to "#{|}" , ${2:path} %>

これによって、同じ snippet をそれぞれの filetype 毎に定義しなくて済みますね。と思いましたが、最初に

<%= %>

だけ展開して、その後に eruby の link_to を展開しようとしてもできない(文脈が ruby に切り替わっているから)ので snippet の定義の仕方はちょっと考える必要がありそうです。とはいえ、そんなに困ることは無さそうですが。
作者の Shougo さん曰く、

context filetypeに対応している

だそうです。どう filetype を判断してるかまでは追えてませんが、時間があるときにソースを覗いてみたいと思います。

久々に「ですます調」で書いてみました。なんとなく。