OmniCppComplete

OmniCppComplete は、ctags のタグファイル使用して、msvc の IntelliSense のようなコードの補完を行います。

☆セットアップ

ここからプラグインを落としてきます。
導入方法は、他のプラグインと同じですが、after/ftplugin を ftplugin にコピーする必要があります。
この時に、ftplugin/c.vim と ftplugin/cpp.vim が上書きされてしまうので注意してください。
設定はこんな感じです。

" OmniCppComplete
let OmniCpp_NamespaceSearch = 1
let OmniCpp_GlobalScopeSearch = 1
let OmniCpp_ShowAccess = 1
let OmniCpp_ShowScopeInAddr = 0
let OmniCpp_ShowPrototypeInAbbr = 1 " show function parameters
let OmniCpp_MayCompleteDot = 1 " autocomplete after .
let OmniCpp_MayCompleteArrow = 1 " autocomplete after ->
let OmniCpp_MayCompleteScope = 1 " autocomplete after ::
let OmniCpp_DefaultNamespaces =["std", "_GLIBCXX_STD"]
" automatically open and close the popup menu / preview window
"au CursorMovedI,InsertLeave * if pumvisible() == 0|silent! pclose|endif
"neocomplcache を使用している場合は副作用が出るので設定しない
"set completeopt=menuone,menu,longest,preview

☆ctags

補完を行うには、ctags を使ってタグファイルを作成する必要があります。
タグファイルを作成するには、あらかじめ、ctags を導入する必要があります。
ctags をコマンドから呼べるようにパスを通しておいてください。
ctags についてはここら辺を参照してください。

☆使ってみる

実際に、補完を行ってみたいと思います。
[test.cpp]

namespace math{

struct vec{
    vec(){}
    ~vec(){}
    int& at_x(){
        return x;
    }
    int& at_y(){
        return y;
    }
protected:
    int x, y;
};

}  // namespace math

int
main(){
    math::vec v;
    v.            // ←ここで補完を行う
    return 0;
}


補完を行う前にタグファイルの作成を vim のコマンドから行います。

:!ctags -R --sort=1 --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ -f

これでソースと同じディレクトリ内にタグファイルが作成され、'::'や'.'を入力した時に補完候補が表示されます。

☆所感

・ctags を作成するのが手間
・補完が完璧ではない(namespace std_ex = std;等は補完されない)
・タグファイルの容量が大きいと補完が遅くなる(boost の タグファイルは、約1.4GB)
・他のタグファイルを使用ているスクリプトと併用できる(かな?
・private が候補から省かれる
・同名のクラスがある場合は候補が混同してしまう
・include の有無に関わらず、タグファイル内の全ての候補が表示されてしまう。
etc...


と、まぁこんな感じで msvc の IntelliSense と比べてしまうとどうしても見劣りしてしまいます。
あと、boost のタグファイルが 1.4GB にもなるので、『boost::』などと打ち込もうものならザ・ワールドが発動します。
あと同名のクラスの場合に、候補が混同してしまうのはすごくまずいと思います。
んーなんとか include 補完と併用出来ないかなぁ……。
include 時にタグファイルを作成して、tags に追加するみたいな。
使いやすさを向上させるにはもうちょっと工夫が必要かなぁ。


[参照]
http://vim.wikia.com/wiki/C%2B%2B_code_completion
http://kaworu.jpn.org/kaworu/2007-08-03-1.php