1. 程式人生 > >clang帶來的clang complete程式碼補全外掛

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應該是最多的