JPTemplateのラッパーを書いた

JPTemplateのスニペットを補完メニューで選択出来るようになりました。

Vimのスニペット系のプラグインとしてJPTemplateを愛用しているんですが、テンプレート名を忘れるとどうしようもないという結構致命的な欠点があります。僕はそれほど数多くのスニペットを使うわけではないのであまり気にしてなかったんですけど、template-vimの補完を見て「やっぱあると良いなー」と思ったので、ラッパー関数を書いてみました。

let g:jpTemplateKey = '<C-S-F12>'

function! s:JPTemplateWrapper()
  let templdir_ft = g:jpTemplateDir.'/'.&ft
  let templdir_general = g:jpTemplateDir.'/general'
  let cword = matchstr(strpart(getline('.'), -1, col('.')), '[-0-9a-zA-Z_]*$')

  if filereadable(templdir_ft.'/'.cword) || filereadable(templdir_general.'/'.cword)
    call jp:InsertTemplate()
  else
    let templates = split(globpath(templdir_ft, '*'), "\n")
    let templates += split(globpath(templdir_general, '*'), "\n")
    call complete(col('.') - strlen(cword), map(filter(templates, 'v:val =~ "'.cword.'"'), 'fnamemodify(v:val, ":t:r")'))
  endif

  return ''
endfunc

inoremap <C-Tab> <C-R>=<SID>JPTemplateWrapper()<CR>

挿入モードでCtrl+Tab(デフォルトのマッピング)を押すと、カーソル位置のファイル名っぽい文字列([-0-9a-zA-Z_])を拾い、もしその文字列でスニペットがあったらJPTemplateを呼んでやってます。スニペットが見つからなかったら全スニペット候補からその文字列で絞り込んで補完メニューを出すので、選択して確定後もう一回Ctrl+Tabでスニペットが挿入されます。

補完メニューで確定したら即スニペット補完とかは難しくて出来ませんでした!