neocomplcache を利用して、OmniCppComplete の補完効率を上げる

さて、前回紹介した OmniCppComplete ですが、そのまま使用するにはいくつか欠点があります。

  • タグファイルを作成するのがめんどくさい
  • 標準C++ライブラリ等を使用する為には予めタグファイルを作成しておく必要がある
  • include に関係なく、全てのタグファイルの中から補完候補が選ばれる
  • boost(笑)

etc...


そこで今回は、neocomplcache のインクルード補完を利用して、補完効率を上げてみたいと思います

☆注意

本記事では、標準C++ライブラリのソースを変更しています。
自身の環境で試す際は、注意してください。

☆環境

neocomplcache

neocomplcache とは、vim の補完機能(キーワード補完やスニペット補完等)を助ける、なんかすごいプラグインです。
neocomplcache では、インクルード補完を行う際に自動的にタグファイルのキャッシングを行っています。
今回はその機能を利用して、OmniCppComplete の補完効率を上げてみたいと思います。
neocomplcacheここから落としてきて導入しておきます。
_vimrc の設定に関しては後ほど書きます。
(ちなみに、すでに導入済みの方も最新版じゃないと動かない可能性があるので注意してください)

☆標準C++ライブラ

gcc に付属している標準C++ライブラリでは、namespace をプリプロセッサで定義しています。

_GLIBCXX_BEGIN_NAMESPACE(std) // namespace std{

// 〜〜〜 std のソース 〜〜〜

_GLIBCXX_END_NAMESPACE        // }


しかし、ctags では、プリプロセッサがうまく展開されないので、このままでは意図した形のタグファイルが作成されません。
ってか、出来る方法があるなら教えてください。
そこで、ctags でタグファイルを作成する際には、_GLIBCXX_BEGIN_NAMESPACE(std) を namespace std{ に変更する必要があります。
わたしの場合は、標準C++ライブラリ(C:\MinGW\lib\gcc\mingw32\4.5.0\include\c++)を ~/.vim/tags/mingw にコピーして、コピー先のソースを一括置換しました。
(元のソースを変更しないように注意してください。)
以下、変更したソースファイルを ~/.vim/tags/mingw にコピーしたとして話を進めます。

☆_vimrc の設定

" neocomplcache 有効にする
let g:neocomplcache_enable_at_startup = 1

"ctags を呼び出す際に追加するオプション
"※最新のneocomplcacheでは設定する必要はない
"let g:neocomplcache_ctags_arguments_list={'cpp' : '-R --sort=1 --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++'}

" neocomplcache が作成したタグファイルのパスを tags に追加する
function! g:UpdateTags()
  NeoComplCacheCachingInclude
    for filename in neocomplcache#sources#include_complete#get_include_files(bufnr('%'))
      execute "setlocal tags+=" . neocomplcache#cache#encode_name('include_tags', filename)
    endfor
endfunction

" ソースを変更した、標準C++ライブラリのパス
set path+=C:/vim/vim73-kaoriya-msvc10_x32j/.vim/tags/mingw

" boost のパス
set path+=c:/boost/boost_1_45_0

g:UpdateTags() はやっつけなので、適当に変更してください。

☆補完を行う

※補完を行う前に ~/.vim/.neocon/include_cache の中身を削除しておいてください。

1.インクルードを行う
2.上書き保存して、neocomplcache でキャッシングを行う
3.g:UpdateTags() で、tags にパスを追加する
4.set tags? でパスの確認
5.:: や . で補完


neocomplcache がインクルードパスを走査するタイミングは
・filetype の決定直後
・ファイルの保存時
らしいです。

☆うまく補完がされなかった場合

次の事を確認してみてください

  • set tags? 等で、tags にタグファイルのパスが追加されている確認する
  • タグファイル(~/.vim/.neocon/include_tags)が作成されているかどう確認する
  • タグファイルの中身があっているか確認する
  • ~/.vim/.neocon/include_cache の中を全部削除してみる

☆欠点/課題

  • 標準C++ライブラリのソースを変更する必要がある
  • 現在開いているバッファのタグファイルが作成されていない
  • ctags では、プリプロセッサが解析出来ないので補完に限界がある
  • boost の可変長引数はプリプロセッサで定義されている場合があるので補完が行えない
  • include を削除しても、tags には追加されたままなので余計なタグファイルのパスが残っている
  • ローカルバッファ?なにそれおいしいの?
  • 標準Cライブラリ?なにそれおいしいの


以上、終了。
かなり綱渡りな感じでやっているので、よく分からない部分やうまく補完されなかった場合はコメント下さい。
@ShougoMatsuさん、いろいろとアドバイスありがとうございました。