clang帶來的clang complete代碼補全插件

用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包是不是已經安裝.

1
2
./configure --enable-pythoninterp --enable-gui=no --enable-cscope --enable-multibyte --enable-fontset --with-features=huge
make -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都是實時編譯的,所以效率可能會有問題,尤其是當代碼非常多的時候.在這裏,作者給了一種解決辦法,就是預編譯.辦法也很簡單,創建一個頭文件,然後include你的那些文件,然後調用clang預編譯一下:

1
clang -x c++-header ./pchheader.h -fno-exceptions -fnu-runtime -o ./pchheader.pch

  上面就是README裏面的示例,預編譯這個pchheader.h,然後

1
echo '-include-pch pchheader.pch -fgnu-runtime' >> .clang_complete

  就可以了.

     4. user option

  上面說的預編譯,和libclang是不能共存的,所以不推薦使用.使用libclang編譯,需要在.vimrc裏面配置:

let g:clang_complete_copen=1
let g:clang_periodic_quickfix=1
let g:clang_snippets=1
let g:clang_close_preview=1
let g:clang_use_library=1
let 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應該是最多的


原文:http://www.cnblogs.com/egmkang/archive/2011/02/20/clang_complete.html

發佈了17 篇原創文章 · 獲贊 7 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章