用vim实现C++代码的自动补全功能

来源:互联网 发布:linux的两大就业方向 编辑:程序博客网 时间:2024/04/28 00:08

 

使用过Source Insight的人一定对它的自动补全功能印象深刻,在很多的集成开发环境中,也都支持自动补全。VIM做为一个出色的编辑器,这样的功能当然少不了。而且,作为一个通用的编辑器,VIM实现的补全功能并不仅仅限于对程序的补全,它可以对文件名补全、根据字典进行补全、根据本缓冲区或其它缓冲区类似的内容进行补全、根据文件语法补全等等,它甚至允许用户自己编写函数来实现定制的补全。

作为系列文章中的一篇,本文以介绍VIM对程序的补全为主,也顺带介绍一下其它的补全方式。本文将分为两篇,第一篇主要介绍VIMOMNI补全,第二篇简要介绍其它的补全方式,以及SuperTab插件。

VIMOMNI补全(以下称“全能补全”)可以支持多种程序语言,包括CC++XML/HTMLCSSJAVASCRIPTPHPRUBY等,详细列表请参阅“:help compl-omni-filetypes”。在本文中,主要介绍CC++的全能补全。

VIM在对不同类型的文件进行补全时,会根据文件类型,为其设置不同的补全函数。也就是说,要实现全能补全功能,需要打开文件类型检测。把下面的命令加到你的vimrc中:

 

你可以查看'omnifunc'选项,来知道当前的补全函数是什么。

CC++代码的全能补全需要使用Exuberant ctags生成的标签文件,我们在前面的文章中介绍过如何使用Exuberant ctags程序来生成标签文件。不过,如果你的Exuberant ctags版本为5.5.4,那么需要为其打上增加"typename:"字段补丁,才能支持C的全能补全。补丁在这里下载:

ftp://ftp.vim.org/pub/vim/unstable/patches/ctags-5.5.4.patch

可以在这里找到MS-Windows上已经编译好的可执行版本:

http://georgevreilly.com/vim/ctags.html

不过我建议使用最新5.6版本Exuberant Ctags。在下面的网站可以下载:

http://ctags.sourceforge.net/

你可以直接下载已经编译好的rpm版本,或者下载源代码。如果是后者,使用以下命令对源代码进行编译:

 

如果你没有系统目录的写权限你可能要把Exuberant Ctags安装到自己的主目录,只需要把上面的“./configure命令改为./configure –prefix=/home/xxx就可以了。

Ctags升级后,使用“ctags –R”更新一下标签文件,现在再进入VIM就可以在C程序中全能补全了。我们依旧以VIM 7.0的源代码为例。

例如,我们在VimMain()函数中,输入“gui”三个字符,然后按下“CTRL-X CTRL-O”,在VIM的状态行会显示“Omni Completeion”,表明现在进行的是全能补全,同时会弹出一个下拉菜单,显示所有匹配的标签。你可以使用来上下选择,在选择的同时,所选中的项就被放在光标位置,不需要再按回车来把它放在光标位置(像Source Insight那样)。

如果更习惯于使用Source Insight这种方式,你可以使用上、下光标键来选择项目,然后按回车把选中的项目放到光标位置。不过这样一来,你的手指就会离开主编辑区,并且需要多输入一个回车键。

本文结尾处提供了一个键绑定,允许在使用"CTRL-P""CTRL-N"时,输入回车表示补全结束,而不是插入回车。

如果补全处于激活状态可以用"CTRL-E"停止补全并回到原来录入的文字。用"CTRL-Y"可以停止补全,并接受当前所选的项目。

缺省的,VIM会使用下拉菜单和一个preview窗口(预览窗口)来显示匹配项目,下拉菜单列出所有匹配的项目,预览窗口则显示选中项目的详细信息。打开预览窗口会导致下拉菜单抖动,因此我一般都去掉预览窗口的显示,这需要改变'completeopt'的值,我的设置如下:

 

上面的设置表明,只在下拉菜单中显示匹配项目,并且会自动插入所有匹配项目的相同文本。

 
如果要支持C++的全能补全,需要到http://www.vim.org下载OmniCppComplete插件,链接如下:

http://www.vim.org/scripts/script.php?script_id=1520



install details1) Unzip the plugin to ~/.vim (unix) or %HOMEPATH%/vimfiles (windows)
2) Run Vim and type the following command :

:helptags $HOME/.vim/doc

or

:helptags $HOME/vimfiles/doc

3) Type :h omnicppcomplete and please read the installation paragraph. 


下载后,把它解压到你的.vim目录(windows下是vimfiles目录),它会安装以下文件:

 

确保你已关闭了VI兼容模式,并允许进行文件类型检测:

 

接下来,使用下面的命令,为C++文件生成标签文件,假定你的文件在src目录树下:

 

在对C++文件进行补全时,OmniCppComplete插件需要在标签文件中包含C++的额外信息,因此上面的ctags命令不同于以前我们所使用的,它专门为C++语言生成一些额外的信息,上述选项的含义如下:

 

现在,进入VIM,设置好tag选项(我在前面的文章中介绍过)。好极了,VIM能够对C++自动补全了!

我写了一个简单的例子,来演示C++的自动补全功能,如下图所示,在输入“t.”后,OmniCppComplete插件会自动弹出struct test1的成员供选择,而在输入“b->”后,又会自动弹出class base的成员供选择,非常方便,连CTRL-X CTRL-O都不必输入OmniCppComplete插件的缺省设置比较符合我的习惯,因此不须对其设置进行调整,如果你需要调整,参阅OmniCppComplete的帮助页。

下表是我的vimrc中设置的键绑定,使用pumvisible()来判断下拉菜单是否显示,如果下拉菜单显示了,键映射为了一个值,如果未显示,又会映射为另一个值。

 

上面的映射都是在插入模式下的映射,解释如下:

- 如果下拉菜单弹出,回车映射为接受当前所选项目,否则,仍映射为回车;

- 如果下拉菜单弹出,CTRL-J映射为在下拉菜单中向下翻页。否则映射为CTRL-X CTRL-O

- 如果下拉菜单弹出,CTRL-K映射为在下拉菜单中向上翻页,否则仍映射为CTRL-K

- 如果下拉菜单弹出,CTRL-U映射为CTRL-E,即停止补全,否则,仍映射为CTRL-U

 

在下一篇文章中,将继续介绍VIM提供的其它补全方式。

 

[参考文档]

1. VIM帮助文件

2. http://vimcdoc.sourceforge.net/

3. http://www.vim.org/tips/tip.php?tip_id=1228

4. http://www.vim.org/tips/tip.php?tip_id=1386

 

[尾记]

本文可以自由应用于非商业用途。转载请注明出处。

原文链接:http://blog.csdn.net/easwy

 

[版本]

23Apr07, easwy, v0.1, initial version

24Apr07, easwy, v0.2, add description of ctags option

15May07, easwy, v0.3, add filetype on, thanks paulhsu

 

windows下用vim实现qt代码的自动补全功能

1.安装vim.
2.下载ctags for win32并解压到c:/ctags/目录下;
3.将c:/ctags加入windows的path环境变量中;
4.下载omnicppcomplete将解压到vim安装目录的vimfiles目录下;
5.转到qt的include目录下执行ctags -R --c++-kinds=+p --fields=+iaS --extra=+q;命令完成后会在该目录下
生成一个tags文件,它是omnicppcomplete和vim用来作命令补全的数据库。
6.在qt的src目录下再执行一遍上述命令;
7.编辑vim安装目录下的_vimrc文件,将下述两行加入其中
set tags+=c:/Qt/4.3.3/include/tags
set tags+=c:/Qt/4.3.3/src/tag
其中c:/Qt/4.3.3/是我机器上qt 的安装目录,根据你的情况作出调整。
8.到你的工程目录下执行5步中的命令;
9.用vim打开一个cpp文件试一下吧,哈哈;

原创粉丝点击