用vim寫C++代碼,基本上沒多少補全外掛程式可以選.我用的是omnicppcomplete,這個外掛程式靠tags來實現補全,效果差強人意.
前一段時間發現了clang complete,發現效果很好(廣告一下:D).所以推薦一下.clang complete是llvm/clang帶來的額外功能.clang complete是靠編譯C++檔案,應該是獲得抽象文法樹,進而進行補全的.所以,補全效果非常好,非常準確.但是,也有可能會比較慢.
OK,有興趣的多去Google一下llvm/clang,關注一下llvm/clang這些個項目.順便關注一下clang_complete,這些項目更新的都很快.
clang complete有兩種補全,一種是用clang(exec)編譯代碼進行補全,另外一種是用libclang,後一種依賴python.我們來看看後一種.
1. 先編譯vim,讓其支援python寫的外掛程式.
我的Debian 6裡面,最開始沒裝python2.6-dev,然後編譯出來的vim死活都不支援py......所以,先要看看是不是裝了python2.6-dev.最新的vim 7.3支援python3的,所以想要支援python3也要看看python3的dev包是不是已經安裝.
./configure --enable-pythoninterp --enable-gui=no --enable-cscope --enable-multibyte --enable-fontset --with-features=hugemake -j2
然後在root許可權下make install,開啟vim,輸入:py,看看出錯資訊,判斷是不是已經支援python了.不支援的話,就只能用clang編譯代碼.
2. 安裝clang complete外掛程式.(巨easy)
到https://github.com/Rip-Rip/clang_complete上面去下載最新的外掛程式,這個外掛程式更新很快,我第一次用的時候,還沒有libclang支援~~,然後按照README,把他拷貝到~/.vim/plugin 下面就行了.
這個時候,開啟一個cpp檔案,看看能不能通過:: , . , ->來獲得智能提示. 順便提一句,clang complete不能和omnicppcomplete和平共處,必須得刪掉omnicppcomplete才可以工作....一般情況下,只要你拷貝對了位置,vimrc裡面開啟了所有外掛程式,那麼就可以獲得智能提示.
3. 先行編譯一些標頭檔
clang/libclang都是Just-In-Time 編譯的,所以效率可能會有問題,尤其是當代碼非常多的時候.在這裡,作者給了一種解決辦法,就是先行編譯.辦法也很簡單,建立一個標頭檔,然後include你的那些檔案,然後調用clang先行編譯一下:
clang -x c++-header ./pchheader.h -fno-exceptions -fnu-runtime -o ./pchheader.pch
上面就是README裡面的樣本,先行編譯這個pchheader.h,然後
echo '-include-pch pchheader.pch -fgnu-runtime' >> .clang_complete
就可以了.
4. user option
上面說的先行編譯,和libclang是不能共存的,所以不推薦使用.使用libclang編譯,需要在.vimrc裡面配置:
let g:clang_complete_copen=1let g:clang_periodic_quickfix=1let g:clang_snippets=1let g:clang_close_preview=1let g:clang_use_library=1let g:clang_user_options='-stdlib=libc++ -std=c++11 -IIncludePath'
這是我的配置,可以參考一下. clang_user_options這邊我開啟了c++11,並且使用libc++而不是libstdc++.
另外,這個.clang_complete還可以用來包含你這個項目需要的額外標頭檔路徑,如果代碼裡面用到的某些標頭檔沒找到,他回到這裡面去找.不過還好,我的Debian裡面沒有這種問題.
後面附上一張clang complete補全的圖片:
PS:
在我的Debian上,加了先行編譯的stl,提示超級快~~. 現在都是用libclang來補全的,速度不錯
另外,如果想要用clang complete,你的代碼必須要能被編譯過去,否則沒辦法提示的....我們代碼就很悲劇,用來很多gcc擴充,而且寫得不標準......
clang 2.8可以比較好的支援C++03,C++0x支援不是很好,估計2.9會改善
clang 3.1 目前支援的c++11應該是最多的