スニペットとは
これを読んでいる時点でスニペットが何かを理解している人が殆どだとは思いますが一応説明します。プログラミングをしているとよく書く記述というものがあるのですが、そういった繰り返し書くコードの冒頭部分を入力した時点でサジェストさせるものです。
今回紹介するUltiSnipsというVimプラグインではかなり自由に、そして簡単に独自のスニペットを作ることが出来ます。まだスニペットを使っていない方は是非インストールした方が良いです。
まずはUltiSnipsをインストールします。Vimプラグインのインストール方法はこちらをご確認下さい。UltiSnipsのインストールが終わったら.vimrcに下記を記述して下さい。
UltiSnipsを使う準備
let g:UltiSnipsExpandTrigger="<tab>"
let g:UltiSnipsJumpForwardTrigger="<c-n>"
let g:UltiSnipsJumpBackwardTrigger="<c-p>"
- <Tab>で登録したスニペットを参照
- <Ctrl-n>で次候補を選択
- <Ctrl-p>で前候補を選択
UltiSnipsでスニペットを登録
all.snippets
まずは全てのファイルから参照するスニペットを登録します。試しにアノテーションコメントのスニペットを登録してみます。下記の様な~/.vim/UltiSnips/all.snippets
を作成して下さい。
snippet '# T' "todo annotation comment <Ctrl-l>"
# TODO: $1
endsnippet
これで登録完了です。新しいバッファを開いて# T
と入力した後に<Tab>を押すと# TODO:
が入力され直後の位置にカーソルが移動します。
rails.snippets
次に.rbファイルを開いて:UltiSnipsEdit
とExコマンドを実行して下さい。~/.vim/UltiSnips/ruby.snippets
が開かれます。ここに記述したスニペットは.rbファイルでのみ参照されるスニペットになります。
下記は私の下手くそなスニペット例です。
snippet 'class' "create basic class <Ctrl-l>"
class ${1}
end
endsnippet
coc.nvimと連携
以前coc.nvimプラグインによる自動補完や、Ruby/Vue.jsのLSP設定についてまとめました。UltiSnipsの候補をcoc.nvimと連携させることも可能です。連携させるには:CocInstall coc-snippets
というExコマンドを実行して下さい。
特にキーマッピングが難しいのですが、下記は取り敢えず<Tab>/<Shift-Tab>
か<Ctrl-n>/<Ctrl-p>
でcoc.nvimの候補を切り替え・入力が出来て、<Ctrl-l>
でスニペットの展開が出来る様になる.vimrcです。
""" for coc.nvim
let g:UltiSnipsExpandTrigger="<Nop>"
let g:UltiSnipsJumpForwardTrigger="<C-n>"
let g:UltiSnipsJumpBackwardTrigger="<C-p>"
let g:coc_snippet_next = '<C-n>'
let g:coc_snippet_prev = '<C-p>'
"" coc.nvim
imap <C-l> <Plug>(coc-snippets-expand)
function! s:check_back_space() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~ '\s'
endfunction
inoremap <silent><expr> <Tab>
\ pumvisible() ? "\<C-n>" :
\ <SID>check_back_space() ? "\<Tab>" :
\ coc#refresh()
inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
以上です。
終わりに
coc.nvimとの連携によるキーマッピングの設定が若干ややこしいものの、独自スニペット定義という機能については使い勝手の良さそうなVimプラグインかと思います。「そう言えば、これ何回も手打ちしてるなー」という瞬間があればどんどんスニペットに追加していくのがおすすめです。