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