用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=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预编译一下:
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=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应该是最多的