1. 程式人生 > >Vim中利用OmniCppComplete實現C++程式碼自動補全

Vim中利用OmniCppComplete實現C++程式碼自動補全

        概述:OmniCppComplete適用於vim7.0及以上,OmniCppComplete利用catags產生的資料庫實現C/C++的程式碼自動補全功能。

一、OmniCppComplete 特點:

    -   Complete namespaces, classes, structs and union members. 
    -   Complete inherited members for classes and structs (single and multiple inheritance). 
    -   Complete attribute members eg: myObject->_child->_child etc... 
    -   Complete type returned by a function eg: myObject->get()->_child. 
    -   Complete the "this" pointer. 
    -   Complete a typedef. 
    -   Complete the current scope (global and class scope). 
    -   Complete an object after a cast (C and C++ cast). 

    -   Complete anonymous types (eg: struct {int a; int b;}g_Var; g_Var.???). It also works for a typedef

二、  安裝步驟:
1、安裝OmniCppComplete。可以到OmniCppComplete的官方下載:點選開啟連結,有時可能除了翻牆沒法開啟。可以從這個地方下載:點選開啟連結。具體參考安裝目錄doc/omnicppcomplete.txt。

2、新建一個儲存ctags資料庫的目錄,例如在安裝目錄下新建一個tags目錄。

3、建立stdc++ tags:下載解壓modified libstdc++ headers 到 tags/cpp_src。官方下載連結:點選開啟連結,或者:點選開啟連結。stdc++ tags介紹:能夠被ctags使用的被稍做了修改的libstdc++標頭檔案,從stdc++標頭檔案建立的ctags資料庫被OmniCppComplete來實現STL、流以及其他標準C++內容的補全功能 。

4、建立stdc++的catags資料庫:
4.1 轉到tags目錄
4.2 執行:

ctags -R --sort=1 --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ -f cpp cpp_src
5、增加額外的tags:
$ ctags -R --sort=yes --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ -f gl /usr/include/GL/   # for OpenGL
$ ctags -R --sort=yes --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ -f sdl /usr/include/SDL/ # for SDL
$ ctags -R --sort=yes --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ -f qt4 /usr/include/qt4/ # for QT4

6、編輯vimrc配置檔案:

" configure tags - add additional tags here or comment out not-used ones
set tags+=~/.vim/tags/cpp
set tags+=~/.vim/tags/gl
set tags+=~/.vim/tags/sdl
set tags+=~/.vim/tags/qt4
" build tags of your own project with Ctrl-F12
map <C-F12> :!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