0 前言
本文介绍如何通过一些插件来拓展vim的功能,以提升办公效率。
1 跳转
可通过如下快捷键实现快速跳转,提高代码阅读效率:
(1)gg:跳转到文本顶端
(2)G:跳转到文本底端
(3)ngg /nG:跳到第n行
2 代码提示
(1)手动
想要手动的代码提示(输入历史、头文件中的函数),可以使用“Ctrl + P”快捷命令。
(2)自动
自动代码提示,要进行设置,见本文的第4节。
3 配置文件
在参考资料[4]中提到“~/.vimrc”文件,在Ubuntu10.04中默认是没有这个文件,但是可以自己创建一个,写上内容,重启终端,然后同样可以生效。
其实,在Ubuntu10.04中,vim的配置文件在“/etv/vim/”中,如下图
其中,vimrc中的配置有效范围是全局的,而上述“.vimrc”的有效范围是局部的。另外,在“/etc/vim/vimrc”中提到:
因此,我们也可以在“/etc/vim”目录下创建一个“vimrc.local”文件,用于配置局部的参数。
4 neocomplcache:关键词、历史记录提示
根据参考资料[3][4]的提示,点击这里下载neocomplcache插件,然后在~目录下创建.vim目录,并将neocomplcache的zip包解压到这个目录。如下图所示:
由上图可见,共5个文件/目录,打开README.md,其中部分内容如下:
根据上述Installation的提示,第1步是将插件放到~./.vim/目录下。这1步刚才已经完成,关键是第2步:在.vimrc中添加let go:neocomplcache_enable_at_startup=1。
根据”三、配置文件"说明,我们在~目录下创建一个.vimrc文件,然后输入:
let go:neocomplcache_enable_at_startup=1
保存.vimrc文件,然后关闭终端,再重新打开。使用vim创建一个*.c文件,然后写一些代码进行测试。可以发现,这时候不仅可以自动提示关键字,还可提示文本中已有的词,如下图:
更多的设置,可以讲README.md中的example复制到.vimrc。但是使用这个配置,如果用方向键选择一个提示关键字,然后回车,这时候会自动换行。这非常不适合本人的使用习惯,于是对于go:neocomplcache,使用let go:neocomplcache_enable_at_startup=1就够了!。
此时,vim可以提示历史关键词和c语言关键词,但是还不能做到自动提示头文件中包含的函数。
5 ctags:函数原型提示
根据第4节的配置,已经可以做到自动提示c语言关键字和历史关键词,这里我们将会借助ctags来实现库函数的提示。
根据参考资料[13]的提示,Ubuntu中使用以下命令安装ctags。
关于ctags的详细用法,见参考资料[9][10][11][12][13],这里主要对它们做一个总结。
(1)为“当前目录”生成tags
这时候,编辑test.c时,可以自动提示world函数原型(在world.h中声明)
(2)为“/usr/include”生成tags
进入/usr/include目录,执行以下命令:
ctags -I __THROW --file-scope=yes --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p -f ~/.vim/systags *
然后在~.vimrc中添加set tags+=~/.vim/systags,如下图:
这时,重启终端,然后使用vim打开一个*.c文件进行编辑测试,就可以自动提示/usr/include下的库函数了,如下图。
(3)多个tags
在(1)(2)中共产生了2个tags,一个在当前目录,一个在~/.vim目录。vim可以同时使用多个tags,因此这两个tags都有效。但是,非当前目录的tags需要使用set tags+=...命令来告诉vim它的位置,另外,非当前目录下的tags名字可以任意起。例如本例中~/.vim目录下的tags命名为systags,并且在.vimrc中使用set tags+=~/.vim/systags告诉vim。
(4)vim -t functionName
根据参考资料[12]的提示,可以在Linux终端中使用vim - t functionName的方法跳转到定义functionName的位置,但是根据(2)的命令产生的tags,测试printf时,提示:
由于(2)是进入到/usr/local执行ctags命令生成tags的,因为没有指定ctags的路径,因此默认使用当前目录(相对路径)因此vim以为tags的位置和*.h在同一个位置(~/.vim/,也即是root用户下的/root/.vim/)!但实际上*.h在/usr/include中,而tags在~/.vim目录中,它们是分开的,因此导致了这个错误!
解决这个问题的方法是,在使用ctags命令时,使用绝对路径,在任意目录上执行:
ctags -I __THROW --file-scope=yes --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p -f ~/.vim/systags /usr/include/*
这是,再在Linux终端上执行vim -t printf,则可跳转到printf的声明处,如下图:
(5)tag functionName
(4)是在Linux命令行中输入的,如果已经使用vim打开了一个文件,怎样跳转到特定函数的定义处呢?答案是在vim中使用tag functionName命令,如下图:
使用这个命令,同样可以达到(4)的目的。
(6)ctags -R
在上的(4)(5)中,只是跳转到了printf函数的声明处,而不是定义处。这主要是(3)中虽然改进了ctags的参数,使得可以正常跳转,但是没有使用-R参数。/usr/include目录下有很多*.h文件,同时也存在很多子目录,子目录中还有*.h文件...而没有使用-R参数,则会将这些子目录忽略掉!因此,在这里对ctags的参数再做一个修改(加了-R,就不用*号了!) :
ctags -I __THROW --file-scope=yes --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p -f ~/.vim/systags -R /usr/include/
这时,再使用(4)(5)的方法,就可以跳转到printf的定义处,如下图:
但是这时候又出现了新问题:再编辑*.c文件时,不能像(2)那样自动提示函数原型了!至于为什加了-R参数就不行,还在纠结中!
经过测试,在其选择一个目录,如~/Documents,在目录中创建*.c文件,然后创建子目录并在其中创建*.h文件,在*.h文件中声明函数。最后使用ctags -R --c-kinds=+p 生成tags,这时使用vim可以自动提示子目录中*.h中声明的函数!
这就说明不是-R的问题,而是/usr/include的问题!
6 cscope:强大的查找功能
使用ctags遇到不爽,那就试试cscope吧。
在Ubuntu中使用以下命名安装cscope:
装好后,无需任何配置,即可使用!
进入/usr/include/目录,执行以下命令:
即可在当前目录下生产3个文件,如下图:
cscope.out就是我们在vim中要使用到的文件。使用vim打开一个*.c文件,然后在命名模式下加载cscope.out文件和其目录,如下图:
然后使用以下命令查找printf:
结果如下:
根据提示,输入1,回车,然后可以跳转到printf的定义处:
需要注意的是,在使用cs add添加cscope.out时,并需同时添加源码目录/usr/include,否则在上面的跳转中会失败:
如果不想每次都手动在vim中使用cs add添加cscope.out和目录,可以在.vimrc中添加,如下图:
有关更多的cscope的命令,见参考资料[17][18][19]。
7 OmniCppComplete:类成员补全
下载一个omnicppcomplete-0.41.zip,然后复制到~/.vim,使用unzip解压,完成安装(由于四中安装neocomplcache时创建了一些目录,所以这里不用再创建,直接解压即可)。然后,根据参考资料[3]有关omnicppcomplete的说明去配置~/.vimrc即可。其实,关于omnicppcomplete的使用,也可以见解压后doc目录中的omnicppcomplete.txt。
8 taglist:显示函数清单
下载taglist.zip,解压到~/.vim中的plugin子目录即可。下图是使用效果:
使用方法也很简单,就在vim的命令模式下输入Tlist即可:
9 YouCompleteMe
纵使安装了上述的插件,使用起来还是不方便,因此尝试一个全新的插件YouCompleteMe。
(1)安装vim-7.4
由于YouCompleteMe需要新版的vim,因此先将原来的vim-7.2卸载:apt-get remove vim vim-tiny vim-common vim-runtime gvim vim-gui-common,如下图:
然后参照参考资料[28]中的方法编译安装vim-7.4,并且配置环境变量。编译过程中出错的解决办法,见参考资料[30]。
安装好新版的vim后,发现不支持cscope,如下图:
此外,准备使用YoucompleteMe时,提示
可见,还得重新编一次,并且要加上Python 2.x的支持,详见参考资料[32]。需要说明的是,其中提到的--enable-multibyte
不是必要的,我编译的时候没有写上。
(2)Vundle:vim管理插件的工具
具体安装可见参考资料[26],还可以看Vundle.vim-master.zip中的README.md。需要注意的是,参考资料[26]的.vimrc的配置有误,主要是将Bundle 'scrooloose/syntastic'的位置改一下就好。修改后如下所示:
set nocompatible " be iMproved
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#rc()
" let Vundle manage Vundle
" required!
" Bundle 'gmarik/vundle'
" My bundles here:
"
" original repos on GitHub
Bundle 'Valloric/YouCompleteMe'
Bundle 'scrooloose/syntastic'
Bundle 'tpope/vim-fugitive'
Bundle 'Lokaltog/vim-easymotion'
Bundle 'rstacruz/sparkup', {'rtp': 'vim/'}
Bundle 'tpope/vim-rails.git'
" vim-scripts repos
Bundle 'L9'
Bundle 'FuzzyFinder'
" non-GitHub repos
Bundle 'git://git.wincent.com/command-t.git'
" Git repos on your local machine (i.e. when working on your own plugin)
Bundle 'file:///Users/gmarik/path/to/plugin'
" ...
filetype plugin indent on " required!
根据参考资料[26]的方法,使用Vundle下载了各个插件后,使用vim打开一个*.c文件,提示如下:
可见,YouCompleteMe需要编译!下面,关于它的编译方法。
(3)LLVM + Clang
在编译YouCompleteMe前 ,还需要编译LLVM+Clang,详见参考资料[26]。由于编译LLVM+Clang要求gcc编译版本为4.7以上,安装方法详见《gcc》,我安装了最新版本gcc-4.9.2。
由于使用了新版本的gcc,因此编译过程出现以下错误。
解决方法见参考资料[33]。需要说明的时,这是需要使用比参考资料[33]更新的libstdc++库,点击这里下载,或者到参考资料[44]中找一个合适的。
解决了libsc++.so.6的问题,现在又出了libc.so.6的问题了,如下图。这个问题比较难解决,详细见《Ubuntu10.04升级glibc》。
(4)结果
在Ubuntu10.04上安装YouCompleteMe真是折腾,主要是glibc太旧了,而且更新不成功(见《Ubuntu10.04升级glibc》),因此我改用Ubuntu14.04了(见《Ubuntu14.04配置YouCompleteMe》)。
参考资料
[1]VIM下的跳转练习
[2]VIM常用命令简记
[5] .vimrc的设置
[6]每日vim插件--强大的自动补全neocomplete.vim和supertab
[7]vim的关键字补全
[10]ctags 小记
[11] ctags使用详解
[12]代码查看小妙招--vim ctags cscope的简单用法
[13]vim代码补全终极配置
[15]Vim自动补全插件----YouCompleteMe安装与配置
[17]Vim + Cscope打造Linux下的Source Insight
[18]Cscope的使用(领略Vim + Cscope的强大魅力)
[19]Cscope 的使用
[22]Ubuntu13.04配置:Vim+Syntastic+Vundle+YouCompleteMe
[23]Ubuntu12.04 YouCompleteMe 终极解决方案
[24]ubuntu配置vim+youcompleteme记录
[25]Ubuntu13.04配置:Vim+Syntastic+Vundle+YouCompleteMe
[26][笔记]ubuntu 13.04 配置YouCompleteMe
[27]Ubuntu12.04安装YouCompleteMe插件
[29]Ubuntu源码编译安装GVIM7.4/VIM7.4
[30]Linux中编译安装VIM:no terminal library found错误解决办法
[31]VIM编辑器之神 可以通过Vundle来管理Vim插件
[32]关于开启VIM的Python支持
[33] 解决/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found问题