使用vim的各位肯定嘗試過各種各樣的自動補全插件,比如說大名鼎鼎的 OmniCppComplete 。這一類的插件都是對 Ctags 生成的符號表進行字符串匹配來獲得可能的補全項。他們在編寫 C 代碼的時候還是很好用的,但是到了 C++ 的環境情況就不同了,各種作用域的存在使得僅僅依靠符號表匹配的方式完全無法發揮作用。
比如我輸入一個 SomeType 的對象 bar,然后我想得到成員變量 a 的提示,但是卻沒有任何事情發生:
struct SomeType { int a; };
void foo()
{
SomeType bar;
bar. // 咦。。。
}
有人會問:那像 Visual Studio 中的 IntelliSense 怎么會有那么好的補全功能呢?
這是因為它利用了微軟的 CL 編譯器的功能對代碼進行語法分析,這樣一來補全工具就知道了各個符號所表示的到底是函數還是類型還是變量,同時也知道了一個作用域里都有那些符號,那么在補全的時候就的心應手了。
然后有人又要問了:如果我們的插件也利用上編譯器的語法分析功能那就不行了嗎?
為了解決這一問題,我們首先可以想到的是利用大家所熟知的 GCC 。但是 GCC 對第三方應用的支持很差,沒有直接的編程接口,一般的應用只能自己解析 GCC 生成的中間文件來獲得所需的信息,這樣的方式既費時又容易出錯。
那有什么其他的替代方式呢?
接下來,我要隆重地介紹新時代的編譯器 Clang,這個基於 LLVM 的編譯器有着比 GCC 更快的編譯速度和更人性化的錯誤提示,並且支持 C, C++, Objective-C 和 Objective-C++。更重要的是 Clang 提供了大量的 API 來供第三方應用調用,甚至直接就有獲得自動補全提示的接口。
我們今天的主角 clang_complete 就是一款基於 Clang 的插件。
安裝方法
-
安裝前提
Vim 7.3 或更高版本
Clang 3.0 或更高版本
沒有安裝 OmniCppComplete
-
直接下載安裝
$ vim clang_complete.vmb -c 'so %' -c 'q' -
從 Github 獲得並生成 (需要python)
$ git clone https://github.com/Rip-Rip/clang_complete.git $ make $ vim clang_complete.vmb -c 'so %' -c 'q'
使用方法
- 輸入類名或命名空間接 :: 之后就會有域成員的提示
- 輸入對象名接 . 之后會有成員符號的提示
- 輸入對象指針接 -> 之后會有成員符號的提示
- 使用 Ctrl + N 強制打開補全列表
- 分別使用 Ctrl + N 和 Ctrl + P 來下翻和上翻

好了話不多說,裝上插件好好地享受 coding 吧!
