Fork me on GitHub

11/19/2010

幫 vim 加上 C++ code completion 功能

IDE 的自動補完功能是非常方便的,如何讓 vim 也有類似 IDE 那般方便的 auto-completion 呢。以下記錄實作的方式。

1. 在 ~/.vim 下建立資料夾 tags

2. 建立 stdc++ tags, 下載並解壓縮 modified libstdc++ headers 到 ~/.vim/tags/cpp_src

3. 建立 ctags 吧
--c++-kinds=+pl : 為C++文件增加函數原型的標籤, 添加 l 讓局部變數也能自動補完
--fields=+iaS : 在標籤文件中加入繼承信息(i)、類成員的訪問控制信息(a)、以及函數的指紋(S)
--extra=+q : 為標籤增加類修飾符。注意,如果沒有此選項,將不能對類成員補全

$ cd ~/.vim/tags
$ ctags -R --sort=1 --c++-kinds=+pl --fields=+iaS --extra=+q --language-force=C++ -f cpp cpp_src 

如果你想要針對特定使用之函式庫也能有自動補完功能,那麼也需要針對該函式庫建立相對應的 tag 檔案,舉 Qt4 為例 (只針對 QtCore 的部份建立 tags):

$ cd ~/.vim/tags
$ ctags -R --sort=1 --c++-kinds=+pl --fields=+iaS --extra=+q --language-force=C++ -f qt4Core /Library/Frameworks/QtCore.framework/Headers


4. 編輯你的 ~/.vimrc 檔案

" configure tags - add additional tags here or comment out not-used ones
set tags+=~/.vim/tags/cpp
set tags+=~/.vim/tags/qt4Core



" build tags of your own project with Ctrl-L
map <C-L> :!ctags -R --sort=yes --c  -kinds= p --fields= iaS --extra= q .<CR>


" OmniCppComplete
let OmniCpp_NamespaceSearch = 1
let OmniCpp_GlobalScopeSearch = 1
let OmniCpp_ShowAccess = 1
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
set completeopt=menuone,menu,longest,preview

5. 然後就可以開始使用啦,新增局部變數的時候記得 更新一下 tags 檔案,就可以 選擇要自動補完的函數或變數囉!

參考資料
1. C++ code completion - Vim Tips Wiki
2. Vim and Ctags tips and tricks - Stack Overflow

3.  The Only Winning Move » Code Completion for Qt4 in Vim - Mac OS X Version

...

No comments:

Post a Comment