vimの便利なPlugin(その13)neosnippet
neosnippetは、予めよく使われる定型のコード(for文やif else文などのプログラムの一部)を登録しておき、neocomplete等の補完機能から呼び出しプログラム内に展開するプラグインです。ここでは、以下の環境での使用を前提にしています。
- CentOS6.8 x86_64
- vim-7.4
Install
今回もdein.vimを前提とさせていただきます。 まだ、dein.vimを使っていない方は(その5)から。
.vimrcに以下の行を追加します。neosnippet-snippetsは、スニッペットを集めた定義ファイル群です。
call dein#add('Shogo/neosnippet-snippets')
これで「:call dein#install()」をコマンドラインモードで実行すればインストールは終了。 また、neocompleteがインストールしてあることが前提ですので、まだの方は、(その8)から。
使い方
.vimrcに以下の行を追加します。*neosnippetのREADMEを参考にしてます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
let g:neosnippet#snippets_directory='~/.vim/my_snippet' " SuperTab like snippets behavior. imap <expr><TAB> \ pumvisible() ? "\<C-n>" : \ neosnippet#expandable_or_jumpable() ? \ "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>" smap <expr><TAB> neosnippet#expandable_or_jumpable() ? \ "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>" if has('conceal') set conceallevel=2 concealcursor=i endif |
neosnippet-snippetsをインストールすると、多くの言語に対応したsnippetの設定ファイルが即利用可能になります。私は、 頻繁に使う言語に対しては、自分のコーディングスタイルに合わせたsnippetを作成しており、上記の1行目では、独自のsnippetを読むディレクトリを指定しています。imapとsmapとconcealの設定は、READMEにあった設定をそのまま記述してます。独自snippetの記述を書く前に、まずはデフォルトでインストールされたままの状態での使用方法を説明してみます。 慣れるまでちょっと操作方法に戸惑うかもしれません。
サンプルとしてC言語でsnippetを呼び出してみます。 ファイル名を”test.c”で新規にファイルを開き、”in”という2文字を入力してみると、neocompleteの補完が機能し、以下の様に候補が出てきます。
[nsnip]と表示されている候補は、neosnippetに登録してあるsnippetであることを示しています。候補の中から1行目にあるincを選択します。選択するには、Ctrl-n で次候補へ移動、逆方向に戻るには、Ctrl-pと入力します。
1行目が黄色くハイライトされてる状態で、Ctrl-k (neosnippetデフォルトでのキーバインド)で以下の様に#include…と展開されます。
初期値でstdioが展開されており、ビジュアルモードで選択されていることが分かります。 この状態でincludeしたいヘッダーファイル名を入力できます。例えばstdlibと入力。 stdioのままで良ければ、そのままTabを叩きます。
もう一つサンプルで、forループの入力を試してみます。
上のgifアニメで実行しているキー入力のシーケンスは、
- インサートモードでfoと入力
- Ctrl-nを入力して初めの候補へ移動
- Ctrl-kを入力して現在の候補を選択
- Tabを入力する(<{2:i}>の”i”上にカーソルが移動)
- Tabを入力する(カウンタ変数がデフォルト設定のまま”i”になる。変更したければここで別の変数を入力)
- Tabを入力する(カウンタ変数へ代入する初期値が0になっている。変更したければここで別の値を入力)
- Tabを入力する(ループの上限の値を指定するところでカーソルが停止)
- 10を入力する
- Tabを入力する(forループの内部に表示されていた#:TARGETが消え、インサートモードになる)
- prと入力する
- Ctrl-nと入力する(printfの候補へ移動)
- Ctrl-kと入力する(printfの候補を選択)
- %dを入力する
- Tabを入力する
- iを入力する
- Tabを入力する
独自スニッペットの作成
ここから少し微妙かもしれないので、もし邪道でしたらお知らせいただけると。。。 さて、deinの設定でインストール先のディレクトリを以下のように設定しているとします。
neosnippetの各言語に対応した設定ファイルは、次のディレクトリ保存されるようです。
~/.vim/dein/repos/github.com/Shougo/neosnippet-snippets/neosnippets/*.snip
自分用のスニッペットのディレクトリを.vimrcに設定(neosnippet#snippets_directory=’~/.vim/my_snippet’)
し、そのディレクトリ内のスニッペット設定のみを適用したいため、neosnippet-snippetsでインストールした設定ファイル(例えばc.snip)を削除してみました。 しかし、どうも消したはずの補完候補も出てきてしまいます。よく探してみるとvim起動時に読み込まれるスニッペットは、次のフォルダから読み込まれているようです。
~/.vim/dein/.cache/.vimrc/.dein/neosnippets/*.snip
ここでは、このディレクトリにある定義ファイルを削除し、独自設定用ディレクトリである”~/.vim/my_snippet/” 配下に定義ファイルを作成していきます。スニペットのファイル拡張子は、.snipとする必要があり、例えばC言語用の設定ファイルは、c.snipとし、C++の場合は、cpp.snipとします。
スニペットの記述ルール
1 2 3 4 5 6 7 8 9 |
snippet [スニペット名] abbr [補完に表示される説明] alias [スニペット名の別名] options [オプション指定] if ( ${1:#:condition} ) { ${2:TARGET} } else { ${3} } |
- [スニペット名]に記述した文字列が、neocompleteの補完候補に現れます。
- [補完に表示される説明]に記述した文字列が、neocompleteの説明としてPopupに表示されます。
- [スニペットの別名]に記述した文字列が、[スニペット名]の別名としてneocompleteの補完候補に現れます。
- [オプション指定]には、head, wordの指定が可能
headを指定すると、行頭に入力し始めた文字列と[スニペット名]が一致するかが評価され補完候補であるかが決定される。wordを指定すると、行頭である必要が無く、単語の区切りで[スニペット名]と一致するかが評価される。
展開されるスニペット内の記述について
1 2 3 4 5 |
if ( ${1:#:condition} ) { ${2:TARGET} } else { ${3} } |
${}と記述された部分は、スニペットがファイル内に展開された後に、カーソルがジャンプ移動してユーザのコード入力を容易にします。カーソルのジャンプする順番は、${}内に指定した数値の昇順となります。但し、 ${0}は最後の飛び先になります。${number:string}のstring部分は、ファイルに展開表示されます。string部分を変更する場合は、上書きして変更することになります。また、${number:#:string}のように記述すると、同様にファイルに展開されますが、stringを上書きせずにカーソルを移動すると展開されたstringは削除されます。${number}とすると、ただのカーソルジャンプ先となり、$numberとするとジャンプ先とはならず、同じ数値で指定された${number}で入力された文字列がコピー反映されます。 ${number:TARGET}とした場合の使用方法が把握しにくいので、次のgifアニメを参考にして下さい。
1 2 3 4 5 6 7 |
snippet testname options head if ( ${1:#:condition} ) { ${2:TARGET} } else { ${3} } |
という設定がc.snipに記述されているとして、
- ビジュアルモードでTARGETの対象となるコードを選択
- Ctrl-kを入力する
- 画面下に出てくる”Please input snippet trigger: “にカーソルが移動するのでtestnameとスニッペット名を入力しエンター(スニペット名を正確に覚えていないと。。。?)
- if文にあるconditionが選択された状態になるので、test_flagと上書き入力
- Tabを入力するとTARGETが、1で選択したコードと入れ替わる
最後に、snippetの定義ファイルの編集は、直接そのファイルを開いて編集する他に、コマンドラインモードで:NeoSnippetEditを実行することで対象snippetファイルを開き、編集することができるようになっています。
参考)adragoonaの日記
この記事へのコメントはこちら
コメントを投稿するにはログインしてください。