vim的OMNI补全(以下称”全能补全”)可以支持多种程序语言,包括C,C++, XML/HTML,CSS,JAVASCRIPT,PHP,RUBY等,详细列表请参阅” :help compl-omni-filetypes“。在本文中,主要介绍C及C++的全能补全。
vim在对不同类型的文件进行补全时,会根据文件类型,为其设置不同的补全函数。也就是说,要实现全能补全功能,需要 打开文件类型检测。把下面的命令加到你的vimrc中:
filetype plugin indent on
你可以查看’omnifunc‘选项,来知道当前的补全函数是什么。
对C及C++代码的全能补全需要使用Exuberant ctags生成的标签文件,我们在前面的文章中介绍过如何使用Exuberant ctags程序来生成标签文件。
可以在这里找到MS-Windows上已经编译好的可执行版本:
http://ctags.sourceforge.net/MS-Windows中我们只需要压缩包里面的ctags.exe,同时我们新建一个批处理文件,命名为“ctags自动补全命令OmniCppComplete用.bat”,在里面添加代码:
ctags.exe -R --c++-kinds=+p --fields=+iaS --extra=+q
有了以上两个文件后,我们就可以生成tags文件了。我的工作目录,vc9.0,stlport,boost库文件分别为
E:\My Projects\Visual Studio 2008\Projects D:\Program Files\Microsoft Visual Studio 9.0\VC\include D:\STLport-5.2.1\stlport D:\boost_1_46_1\boost我们可以把ctags.exe和bat文件拷贝到以上目录,双击bat文件,就会生成相应的tags文件了。
注:boost的typeof目录中存在循环嵌套,ctags文件会无限增长。这是由于typeof里面的vector50.hpp,vector100.hpp,vector150.hpp,vector200.hpp造成的,移走这些生成tags以后,再移回来就ok了。
接着,我们就要修改vimrc的设置,添加下面代码:
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " => Exuberant Ctags 设置 2011-6-3 15:50:30 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" set tags+=tags; set autochdir set tags+=D:\STLport-5.2.1\stlport\tags set tags+=D:/Program\ Files/Microsoft\ Visual\ Studio\ 9.0/VC/include/tags set tags+=D:\boost_1_46_1\boost\tags;注意第一个命令里的分号是必不可少的。这个命令让vim首先在当前目录(即你所编辑文件的目录)里寻找tags文件,如果没有找到tags文件,或者没有找到对应的目标,就到父目录中查找,一直向上递归。因为tags文件中记录的路径总是相对于tags文件所在的路径,所以要使用第二个设置项来改变vim的当前目录。
由于vimrc不支持路径存在空格,但是支持两种斜杠表示方式,所以针对vc9.0可以用以上的表示方式。
缺省的,vim会使用下拉菜单和一个preview窗口(预览窗口)来显示匹配项目,下拉菜单列出所有匹配的项目,预览窗口则显示选中项目的详细信息。打开预览窗口会导致下拉菜单抖动,因此我一般都去掉预览窗口的显示,这需要改变’completeopt‘的值,我的设置如下:
set completeopt=longest,menu
上面的设置表明,只在下拉菜单中显示匹配项目,并且会自动插入所有匹配项目的相同文本。
如果要支持C++的全能补全,需要到vim主页下载OmniCppComplete插件,链接如下:
http://www.vim.org/scripts/script.php?script_id=1520
下载后,把它解压到你的.vim目录(在windows下是vimfiles目录),它会安装以下文件:
after\ftplugin\cpp.vim autoload\omni\common\debug.vim \utils.vim autoload\omni\cpp\complete.vim \includes.vim \items.vim \maycomplete.vim \namespaces.vim \settings.vim \tokenizer.vim \utils.vim doc\omnicppcomplete.txt
确保你已关闭了vi兼容模式,并允许进行文件类型检测:
set nocp filetype plugin on
在vimrc中进行如下设置
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " => omnicppcomplete 设置 2011-6-4 1:29:01 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" set completeopt=menu let OmniCpp_GlobalScopeSearch = 1 " 0 or 1 let OmniCpp_NamespaceSearch = 1 " 0 , 1 or 2 let OmniCpp_DisplayMode = 1 let OmniCpp_ShowScopeInAbbr = 0 let OmniCpp_ShowPrototypeInAbbr = 1 let OmniCpp_ShowAccess = 1 let OmniCpp_MayCompleteDot = 1 let OmniCpp_MayCompleteArrow = 1 let OmniCpp_MayCompleteScope = 1