読者です 読者をやめる 読者になる 読者になる

neocomplcacheでオートコンプリート

 今日はオートコンプリート周りのこと。autocomplpop→自作オートコンプリート(ただしまくるだけ)→neocomplcacheと移ってきました。自作オートコンプリートに移った理由も当時rubyomni補完するとvimが落ちるという不具合に遭遇してて、autocomplpopは自動でomni補完してくれちゃってたので使うと自動的に落ちてました...。
 というのはもう昔の話で、最近はちゃんとrubyomni補完してもvimが落ちないようになりまして、そろそろオートコンプリート拡張したいなぁなどと思ってたのが2日前。調べているとneocomplcacheがありましたとさ。
GitHub - Shougo/neocomplcache.vim: Ultimate auto-completion system for Vim.
あるVimmerのブログ
さっそくバージョン3.13をダウンロード、配置して.vimrcに以下のように加えて使用してます。

let g:NeoComplCache_EnableAtStartup               = 1 
let g:NeoComplCache_MaxList                       = 20
let g:NeoComplCache_KeywordCompletionStartLength  = 2 
let g:NeoComplCache_MinKeywordLength              = 2 
let g:NeoComplCache_MinSyntaxLength               = 2 
let g:NeoComplCache_SmartCase                     = 1 
let g:NeoComplCache_EnableCamelCaseCompletion     = 1
let g:NeoComplCache_EnableUnderbarCompletion      = 1

let g:NeoComplCache_SnippetsDir = $HOME . '/.vim/snippet'



let g:NeoComplCache_DictionaryFileTypeLists       = {'default' : ''} 
autocmd Filetype *
      \   if &filetype !=# ''
      \     && findfile(&filetype . ".dict", $HOME . "/.vim/dict") !=# ''
      \     && !has_key(g:NeoComplCache_DictionaryFileTypeLists, &filetype)
      \ |   call extend(g:NeoComplCache_DictionaryFileTypeLists,
      \       { &filetype : findfile(&filetype . ".dict", $HOME . "/.vim/dict") })
      \ | endif


 でもって使用していてすぐにneocomplcacheが一部の辞書を補完してくれないという不具合に遭遇しました。rubyの辞書だけどうも補完してくれないことが多いです。ちゃんと

g:NeoComplCache_DictionaryFileTypeLists
{'ruby': '.vim/dict/ruby.dict', 'default': ''}

と辞書は参照できているので記述に問題はありませんし、希に補完できたりします。c用の辞書ではちゃんと補完してくれます。これは困った。


 原因を調査してみると、どうやら辞書をキャッシュしていると補完できなくなるようです。cの辞書は370行くらいでキャッシュされなかったようですが、rubyの方では1400行くらいあるのでこっちはキャッシュされてたみたいです。ruby用の辞書のキャッシュを確認見てみると

%cat .neocon/buffer_cache/.vim=+dict=+ruby.dict=
1
1
1
1
1
...

見たいに1しか書かれてません。これであってるんですかね? とりあえず一時的な解決策として.neocon/buffer_cacheのパーミッションをいじって書き込めないようにして見ました。とりあえず補完は出来るようになりましたが、起動直後は辞書をキャッシュ使用とするので起動にちょっと時間が掛かるように。それと終了時にキャッシュが書き込めないってエラー吐きます。良いのか悪いのかw

追記:バージョン3.14が出まして、この不具合は解消されました。


 もうひとつ遭遇した不具合?はTeX用のスニペットが少なかったので、書き足してたのですが、

snippet     \begin
   \begin{${1:type}}
       ${2}
   \end{$1}
   ${0}

 
snippet     begin
   \begin{${1:type}}
       ${2}
   \end{$1}
   ${0}

上だと上手く動作してくれません。snippetに\記号が入ってるとどうも動かないみたいです。あるいは自分の環境だけかも?発想の転換するといちいち\に指を伸ばすのも面倒なのである意味好都合ですかねw

追記:こちらは仕様だそうです。