Vim 中使用 clang complete 为 C/C++ 自动补全
分类:技术
前文再续,书接上回。上回咱们讲到,如何在 Vim 中使用 OmniCppComplete 为 C/C++ 自动补全;今天偶然间发现了个新玩意儿:clang complete。
前情提要
OmniComplete 是 Vim 中的智能补全功能,而 OmniComplete 本身并不知道如何补全,具体的「通过光标前的内容猜测光标后可能出现的内容」的工作是由不同的外部插件实现的。
上回说到的 OmniCppComplete 就是这样一个插件。实际需要预先调用 ctags 对源代码进行词法分析(吧?)生成 tags 文件(token 列表),然后在这个 tags 文件中去进行匹配。所以局限也很快暴露出来:无论是库的头文件还是自己的源代码,都要用户自己事先对它运行一遍 ctags。
clang complete 则是借助 clang 来分析源代码,毕竟没有比编译器更了解代码的东西了。
如何安装
需要注意两个前提:
- clang complete 和 OmniCppComplete 冲突
- 如果想成功起效,请确保你有安装 clang……(废话 = =)
那么,你可以选择直接去 Vim 官方插件列表页获取,或者去作者的 GitHub clone
,抑或使用 Vundle 安装即可。
如果获取的是 vmb 文件,那么命令行执行
vim clang_complete.vmb -c 'so %' -c 'q'
Windows 下则直接用 Vim 打开,然后 :source %
……(呃,这好像也是废话 = =)
p.s. 强烈推荐试一试用 Vundle 来管理 Vim 的插件。
clang complete 是即拆即食的(OmniCppComplete 在安装完成后还需要到处生成 tag 文件),编辑状态输入 .
和 ->
和 ::
后都会自动进行补全,一般状态下 Ctrl-X Ctrl-O 或者 Ctrl-X Ctrl-U 都能手动调用补全。
配置文件
如果在补全时发现提示「Pattern not found」提示,可以试试 :copen
查看错误信息。
错误信息很可能是语法错误,或者头文件未找到。
没错,因为 clang 是编译器,每次补全实际上都对整个源代码进行分析。要正确编译,可能需要额外传一些 -D 宏定义
和 -I 头文件路径
给 clang。为了解决这一问题,clang complete 默认会在加载文件时读取该目录下名为 .clang_complete
的文件,该文件中就可以添加这样的信息,例如:
-DNDEBUG
-I../include
`pkg-config gtk+-2.0 --cflags`
当然,链接是不会执行的,所以不必把链接选项写进去。
其它
如果你觉得补全得慢,可以尝试让它使用 libclang 而不是 clang:
let g:clang_use_library=1
let g:clang_library_path="path to libclang"
这个功能需要你的 Vim 有 Python 支持……
你好博主 ,怎么::出来的背景颜色是一片粉红呢?捉急。。你知道怎么修改吗?
你好 :) 可以在 vimrc 里修改,比如:
highlight Pmenu guibg=darkgrey guifg=black
highlight PmenuSel guibg=lightgrey guifg=black
Pmenu 是所有项的配色,PmenuSel 是选中项的配色,guibg 和 guifg 分别对应背景色和前景色。
前一篇 OmniComplete 里最后有写,这回漏掉了,囧。