Vimで精度の高いC++のコード補完を行う

Vimでコード補完するプラグインと言えばneocomplcacheが有名ですが、さすがにC++の補完はなかなか辛いところがあります。(それでもかなり高機能ですが)
そこそこに精度が高い補完を求めるのならOmniCppCompleteを使う手もありますが、これでも限界はあります。
そこでもっと高い精度でのC++のコード補完行うためのプラグインでclang_completeというものがあります。

clang_complete

これはClangという静的コード解析ツールを用いてVim上で解析結果を補完に反映させようというプラグインです。
実際のClangはC++などのコンパイラフロントエンドであり、静的コード解析はあくまでその機能のひとつです。
LLVMと共に現在も絶賛開発中でC++11対応なども期待出来るところです。

clang_completeとneocomplcache-clang

実はclang_completeはneocomplcacheと衝突するため、同時にそのままでは使えません。
なので今回はその競合を解消したneocomplcache-clangを使用します。
とりあえず最低限必要なものは以下の通りです。

clang

neocomplcache

neocomplcache-clang


また、以下は絶対ではないもののあった方がいいもの

python

vimproc

Clangの導入

今回の環境はWindowsの32bit環境なのでリンクから"Clang Binaries for Mingw32/x86"を選択し、最新のClangバイナリを手にいれます。
64bit環境の場合はバイナリがないので自分でLLVMのソースからコンパイルする必要があります。
もちろんそれだと一気に敷居が上がるのでオススメはしません。出来るなら64bit環境でも32bitのVimを使った方がいいでしょう。私がそうなので。
ここらへんはOSや環境に応じて選んでください。場合によってはここで摘んでしまいます。
あとはClangのバイナリ(exeやdll)を適当な場所("C:/llvm/bin"みたいな)に置いてClang側の準備は完了です。

neocomplcacheとその他の設定

まず当然としてneocomplcacheneocomplcache-clangをインストールしておきます。
出来ればここでpythonが使えるようにpythonインタフェースを導入しておくといいです。
pythonインタフェースがあるとlibclangが使用可能になり、更に高速な補完が可能となります。
pythonインタフェースに関しては以下を参考に。

Hack #132: Pythonインタフェースを使う(1)

更にvimprocを使えるようにするとコード補完が非同期になり、操作しやすくなります。

_vimrc(.vimrc)への設定

" 1だとlibclang(clang.dll)を使用する ※要pythonインタフェース
let g:neocomplcache_clang_use_library=1
" Clangバイナリがある場所を指定する
let g:neocomplcache_clang_library_path='C:/llvm/bin'
" ライブラリ指定などのオプション 必要に応じてパス変更で
let g:neocomplcache_clang_user_options =
        \ '-I C:/MinGW/lib/gcc/mingw32/4.5.2/include '.
        \ '-I C:/lib/boost_1_47_0 '.
        \ '-fms-extensions -fgnu-runtime '.
        \ '-include malloc.h '
" neocomplcache で表示される補完の数を増やす
" 補完の数が少ないとstd::vectorなど一部が補完に出現しなくなったりします
let g:neocomplcache_max_list=1000

以上でClangを使用したC++の補完が可能となります。


実際の補完時

その他注意事項

  • 補完する側のコードにシンタックスエラーがある(静的解析なのでエラーがあると補完出来ません)
  • パスがちゃんと通っていない
  • let g:neocomplcache_clang_complete_use_libraryが0と1の場合は挙動が違うので注意
  • 上記が1の場合はpythonインタフェースが動作しておらずエラーが出る可能性あり
  • Vimのバイナリが64bitのケースはClangもpythonも全て64bitの必要があります
  • プリコンパイルヘッダは更に設定が必要なのでこのままでは動作しない(私も動作確認出来ていません)
  • BoostやC++標準ライブラリを使うとそれなりに補完に時間がかかります(マシンスペックで差がでます)
  • Vimプラグインの中ではトップクラスにメモリをくうのでswapに注意(下手するとマシンが固まります)


とりあえず色々とややこしいです。ひとつでも間違っていると正常に動作しないので根気強くやりましょう。
上手くいけばC++の補完をかなりの精度で行うことが出来るようになっているはずです。

2011/8/24追記

neocomplcache-clangのオプション名が変更されたので現在のものへと変更。
旧オプション名は最新では使えないので注意。