neosnippet.vim を活用しよう

この記事は Vim Advent Calendar 2012 320日目の記事になります。


さて、今回は neosnippet.vim の便利そげな使い方でも簡単に書いてみます。

[neosnippet.vim とは]

neosnippet.vim とは Shougo 氏が作成されたスニペット補完を行うためのプラグインです。
予め設定しておいた定型文を簡単に挿入する事ができます。

NeoBundle 'Shougo/neosnippet'


また、単体でも使用する事は可能ですが、neocomplete.vim または neocomplcache と併用して使用するとよいでしょう。

NeoBundle 'Shougo/neocomplete.vim'

[スニペットを定義する]

neosnippet.vim で使用できるスニペットはユーザ側で定義する事ができます。
スニペットファイルは filetype ごとに設定でき、

NeoSnippetEdit

で、現在の filetype のスニペットファイルを編集する事ができます。
例えば、Vim script の if 文は

snippet     if
abbr        if endif
    if ${1:condition}
        ${0}
    endif

のような記述で定義する事ができます。


詳しくは、

:help neosnippet-snippet-syntax

を参照して下さい。

[Vim script の式を埋め込む]

neosnippet.vimスニペットでは `` で囲った文字列は Vim script の式として評価されます。
例えば、次のような定義をすると

snippet     test
    `join(range(10), ', ')`


と、いうように展開されます。
これは様々なことに利用する事ができます。

[現在開いているファイル名を展開する]

現在開いているファイル名などを展開することもできます。

snippet     filename
alias       fname
    `expand("%")`

snippet     ffilename
alias       ffname
    `substitute(expand("%:p"), '\', '/', "g")`


ファイル名などをサッと挿入したい場合に便利ですね。

[関数名を展開する]

他のプラグインと組み合わせると更に強力です。
例えば、current-func-info.vim を使用すればカーソル位置内の関数名を挿入する事もできます。

snippet     funcname
    `cfi#get_func_name()`

[plugin のテンプレートを定義]

上記の応用です。
Vimプラグインで plugin にスクリプトファイルを記述する場合、たいていは次のような定型文を埋め込みます。

" 文字コードを設定したり、g:loaded を仕込んだり etc...
scriptencoding utf-8
if exists('g:loaded_marching')
  finish
endif
let g:loaded_marching = 1

let s:save_cpo = &cpo
set cpo&vim

" ...

let &cpo = s:save_cpo
unlet s:save_cpo


これを毎回書くのはしんどいので neosnippet.vim で定義しておくとよいです。

snippet     plugin
abbr        plugin
    scriptencoding utf-8
    if exists('g:loaded_`expand("%:t:r")`')
      finish
    endif
    let g:loaded_`expand("%:t:r")` = 1

    let s:save_cpo = &cpo
    set cpo&vim

    ${0}

    let &cpo = s:save_cpo
    unlet s:save_cpo


g:loaded の変数名をファイル名で定義するんですが、`` を使用して動的に設定するようにしています。
既に neosnippet.vim でも組み込まれていますが、autoload 関数や C言語,C++ のインクルードガードのように現在のファイルパスに依存するような定型文を記述する場合に大変有効です。


と、いう事で neosnippet.vim の設定を幾つか紹介してみました。
Vim script の式が埋め込めるのはだいぶ便利なのでどんどん使ってみるとよいです。