vim配置及插件安装管理(下载编译)
1.前言
在开始操作前,先普及下基础概念,然后约定一下表达规范。
1)Vim存在多个配置文件vimrc,比如/etc/vimrc,此文件影响整个系统的Vim。还有~/.vimrc,此文件只影响本用户的Vim。而且~/.vimrc文件中的配置会覆盖/etc/vimrc中的配置。这里我们只修改~/.vimrc文件。
2)Vim的插件(plugin)安装在Vim的runtimepath目录下,你可以在Vim命令行下运行"set rtp“命令查看runtimepath的路径包含哪些。这里我们选择安装在~/.vim目录,没有就创建一个。
注:我们会将下载的插件压缩包及解压出来的源码放到~/.vim目录,同时在~/.vim下创建bin目录,将插件编译后生成的目标文件放入~/.vim/bin目录。此处注意要在~/.profile中增加~/.vim/bin的环境变量,这样~/.vimrc才可以查找到相应的可执行文件。
3)当本文说”在Vim命令行下运行cmdxx命令“时,意思是指在Vim的命令行模式下运行cmdxx命令,即在Vim的正常模式下通过输入冒号":"进入命令行模式,然后紧接着输入命令cmdxx。在后文描述中都会省略冒号":"输入。
4)如果没有说明“在Vim命令行下运行某命令”,则是在shell中执行该命令。
5)如果命令中间被空白符间隔或有与正文容易混淆的字符,我会用双引号将命令与正文区分。所以读者在实际操作时,不要输入命令最前面和最后面引号。
6)本文关于组合快捷键的描述,形如a-b形式的快捷键表示同时按下a键和b键,而形如"a-b c"形式的快捷键,则表示先同时按下a键和b键,然后放开ab键,再按下c键。
2.Ctags
2.1 作用
Ctags工具是用来遍历源代码文件生成tags文件,这些tags文件能被编辑器或其它工具用来快速查找定位源代码中的符号(tag/symbol),如变量名,函数名等。tags文件是Taglist和OmniCppComplete工作的基础。
2.2 安装步骤
1)从http://ctags.sourceforge.net/下载源代码包后,解压缩生成源代码目录,
2)然后进入源代码根目录执行./configure,
3)然后执行make(如果make出错,可以执行make clean再执行make)
4)编译成功后执行make install。
注:此处我们是将生成的二进制文件放到了~/.vim/bin目录下,通过设置~/.vim/bin环境变量给~/.vimrc使用
5)在~/.vimrc中增加以下这行:
nmap <F12> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
这样就在Vim中配置了F12快捷键,所以可以进入代码根目录后,打开Vim,按下F12快捷键自动生成tags文件。命令执行完后,会在源代码目录生成tags文件(注意:如上命令需安装taglist后才生效,否则需要删除<CR> :TlistUpdate<CR>)。
Vim默认会自动读取当前目录下的tags文件,所以不需要修改~/.vimrc文件。
2.3 使用
此时,我们已经具有定义跳转的功能了。有两组快捷键是最常用的。
Ctrl-] 跳转到光标所在符号的定义。
Ctrl-t 回到上次跳转前的位置。
更多功能通过命令man ctags或在Vim命令行下运行help ctags查询
注:对如上命令的解释:
(1)nmap将!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>映射为F12。
(2)-R:表示扫描当前目录及所有子目录(递归向下)中的源文件
(3)--c++-kinds=+px:要求ctags记录c++文件中的函数声明和各种外部和前向声明
(4)--fields=+ias:
–fields=[+|-]flags
–fields指定tags的可用扩展域(extension fields),以包含到tags入口。
i:继承信息Inheritance information
a:类成员的访问控制信息 Access (or export) of class members
S: 常规签名信息,如原型或参数表 Signature of routine(e.g. prototype or parameter list)
(5)--extra=+q
–extra=[+|-]flags
指定是否包含某种扩展信息到tags入口。
q:包含类成员信息(如c++,Java,Eiffel)。
但就算是C 语言的结构,也需要这两个参数设置才能获取成员信息。
(6)<CR> : 代码窗口跳转到标签列表窗口中光标所在标签定义处
:TlistUpdate 更新当前缓冲区的标签信息
3.Taglist
3.1 作用
Taglist是vim的一个插件,提供源代码符号的结构化视图。
3.2 安装
1)从http://www.vim.org/scripts/script.php?script_id=273下载安装包,也可以从http://vim-taglist.sourceforge.net/index.html下载。
2)进入~/.vim目录,将Taglist安装包解压,解压后会在~/.vim目录中生成几个新子目录,如plugin和doc(安装其它插件时,可能还会新建autoload等其它目录)。
3)进入~/.vim/doc目录,在Vim下运行"helptags ."命令。此步骤是将doc下的帮助文档加入到Vim的帮助主题中,这样我们就可以通过在Vim中运行“help taglist.txt”查看taglist帮助。
4)打开配置文件~/.vimrc,加入以下两行:
let Tlist_Show_One_File=1 let Tlist_Exit_OnlyWindow=1
到此安装已经完成。
3.3 使用
在Vim命令行下运行TlistToggle(或Tlist)命令就可以打开Taglist窗口,再次运行TlistToggle(Tlist)则关闭。示图如下:

我们可以通过Ctrl-w快捷键或鼠标点击在Taglist窗口和编辑区之间切换焦点,在Taglist窗口用鼠标或键盘选择某个符号,然后点击或回车,就可以跳转到该符号定义的位置。
更多功能可通过在Vim命令行下运行help taglist.txt查询。
4. Cscope
4.1作用
Cscope提供交互式查询语言符号功能,如查询哪些地方使用某个变量或调用某个函数。
4.2 安装
Cscope已经是Vim的标准特性,默认都有支持,官方网址为http://cscope.sourceforge.net/。
1)在Vim下运行version查看Vim支持哪些特性,前面有前缀符号+的为支持。如果支持Cscope,则直接进入2),否则下载Cscope源代码包编译安装。步骤同Ctags安装。
2)确定Vim已支持Cscope后,将文件http://cscope.sourceforge.net/cscope_maps.vim下载到~/.vim/plugin目录。
4.3 使用
到这里,我们就可以开始使用Cscope了。
1)使用Cscope需要生成cscope数据库文件。进入项目代码根目录运行命令:
cscope -Rbq -f path/xxx.out
命令运行后会生成xxx.out文件,即cscope数据库文件。更多用法参考man cscope文档。
2)进入项目代码根目录,在Vim下运行命令:
此命令将cscope数据库载入Vim。
3)Cscope常用快捷键
Ctrl-\ s 查找所有当前光标所在符号出现过位置。
Ctrl-\ c 查找所有调用当前光标所在函数的函数。
按下快捷键查找结束后会在编辑区下方出现查找结果的列表,输入结果编号并回车,就能跳转到该查找结果在源代码中的相应位置。例如,我们将光标移到initial_pool_size变量定义的位置,即17行,然后按下"Ctrl-\ s"组合快捷键,得到示图如下:

然后我们输入2,并回车,就能跳转到第2个查找结果。
为了界面更好看,可以把Cscope的查找结果输出到quickfix窗口,需要在~/.vimrc中加入下面这行:
set cscopequickfix=s-,c-,d-,i-,t-,e-
这样,通过快捷键查找某个符号后,会立即跳转到第一个找到的该符号出现的位置。如果你对这次默认跳转的位置不满意,在Vim命令行下运行:cw命令,就能在编辑区下面quickfix窗口看到所有查找结果的列表,点击相应列表项就能跳转到相应位置。这个功能已经跟VS很接近了吧:)

(4)cscope的主要功能是通过同的子命令"find"来实现的
"cscope find"的用法:
cs find c|d|e|f|g|i|s|t name
| 0 或 s | 查找本 C 符号(可以跳过注释) |
| 1 或 g | 查找本定义 |
| 2 或 d | 查找本函数调用的函数 |
| 3 或 c | 查找调用本函数的函数 |
| 4 或 t | 查找本字符串 |
| 6 或 e | 查找本 egrep 模式 |
| 7 或 f | 查找本文件 |
| 8 或 i | 查找包含本文件的文件 |
如果每次查找都要输入一长串命令的话还真是件讨人厌的事情, Cscope的帮助手册中推荐了一些快捷键的用法, 下面是其中一组,也是我用的, 将下面的内容添加到~/.vimrc中, 并重启vim:
|
nmap <C-_>g :cs find g<C-R>=expand("<cword>")<CR><CR> nmap <C-_>c :cs find c<C-R>=expand("<cword>")<CR><CR> nmap <C-_>t :cs find t<C-R>=expand("<cword>")<CR><CR> nmap <C-_>e :cs find e<C-R>=expand("<cword>")<CR><CR> nmap <C-_>f :cs find f<C-R>=expand("<cfile>")<CR><CR> nmap <C-_>i :cs find i^<C-R>=expand("<cfile>")<CR>$<CR> nmap <C-_>d :cs find d<C-R>=expand("<cword>")<CR><CR> |
当光标停在某个你要查找的词上时, 按下<C-_>抬起g, 就是查找该对象的定义, 其他的同理.
按这种组合键有一点技巧,按了<C-_>后要马上按下一个键,否则屏幕一闪就回到nomal状态了
更多功能可通过命令man cscope或在Vim命令行下运行help cscope查询。
5.文件浏览器-- netrw.vim插件
5.1 作用
netrw.vim插件是一个文件浏览器插件,通过它可以首先文件浏览、编辑、排序等强大的功能。
5.2 安装
netrw.vim不用下载和安装,这个插件已经是标准的vim插件, 已经随vim一起安装进你的系统里了
5.3 使用
假设我要查看~/x_project/u-boot目录下的文件,则:
在vim命令行输入:e ~/x_project/u-boot即可显示u-boot目录下的文件(目录),同时还可以按照下表中的命令进行相应的操作
| <F1> | 显示帮助 |
| <cr> | 如果光标下是目录, 则进入该目录; 如果光标下文件,则打开该文件 |
| - |
返回上级目录 |
| c |
切换vim当前工作目录正在浏览的目录 |
| d |
创建目录 |
| D |
删除目录或文件 |
| i |
切换显示方式 |
| R |
文件或目录重命名 |
| s |
选择排序方式 |
| x |
定制浏览方式,使用你指定的程序打开该文件 |
6. 文件浏览器和窗口管理器 -- 插件: WinManager
6.1 作用
WinManager插件来将TagList窗口和netrw窗口整合起来,既可以看到文件浏览器的窗口,也可以看到tag定义的窗口
6.2 安装
下载地址为:http://www.vim.org/scripts/script.php?script_id=95
然后在~/.vim目录下解压winmanager.zip
6.3 使用
现在在你的~/.vimrc中增加下面两句:
letg:winManagerWindowLayout='FileExplorer|TagList'
nmap wm :WMToggle<cr>
然后重启vim, 打开~/x_project/u-boot/board/actions/bubblegum/board.c,在normal状态下输入"wm", 你将看到图7的样子:

其中左上边是netrw窗口, 左下边是TagList窗口,当再次输入"wm"命令时这两个窗口又关闭了.
7. QuickFix 窗口
7.1 作用
“QuickFix”窗口是一个显示查询结果的窗口,这个窗口中列出了查询命令的查询结果, 用户可以从这个窗口中选择每个结果进行查看。QuickFix窗口的主要作用: 输出一些供选择的结果, 可以被很多命令调用,更详细的介绍和使用方法请用下面的命令打开QuickFix的手册来学习吧:helpquickfix
7.2 安装
以前QuickFix是一个vim的插件, 只不过现在成了vim的标准插件, 不用你在去安装了
7.3 使用
这里我一个常用的例子来再介绍一种QuickFix窗口的使用方法. 这个例子是要模仿平时我们编程时, 当编译出错时,QuickFix会把出错的信息列出来, 供我们一条条地查看和修改. 首先还是用vim打开~/vim71/src/main.c,事先最好先编译过vim71, 否则一会儿编译的时候有点慢, 或者你也可以自己写一个小的有错误的程序来跟着我做下面的步骤,见下图:

我们修改一下main.c, 人为地造成几处错误, 在第1019行增加了一个baobao_wu的没有任何定义的字符串,删除了第1020行最后的一个括号")", 然后用下面的命令进行编译:
:make
显然编译会报很多错误, 当编译结束并退出到源码界面时, 刚才编译器报的错误都已经看不到了,但是我们可以用QuickFix窗口再将错误信息找出来, 用下面的命令调出QuickFix窗口:
:cw
此时你就可以看如下图所示的QuickFix窗口了:

在下面的QuickFix窗口中我们可以找到每一个编译错误, 同样你可以用鼠标点击每一条记录, 代码会马上自动跳转到错误处,你还可以用下面的命令来跳转:
:cn
:cp
如果你经常使用这两个命令, 你还可以给他们设定快捷键, 比如在~/.vimrc中增加:
| nmap<F6> :cn<cr> nmap <F7> :cp<cr> |
其还有其他的命令/插件也会用到QuickFix窗口, 但是用法基本上的都是类似的, 本文后面还会用到QuickFix窗口,接着往下看吧.
8. 快速浏览和操作Buffer -- 插件: MiniBufExplorer
8.1 作用
在编程的时候不可能永远只编辑一个文件,你肯定会打开很多源文件进行编辑, 如果每个文件都打开一个vim进行编辑的话那操作起来将是多麻烦啊,所以vim有buffer(缓冲区)的概念, 可以看vim的帮助:
:help buffer
vim自带的buffer管理工具只有:ls, :bnext, :bdelete 等的命令, 既不好用, 又不直观.现在隆重向你推荐一款vim插件(plugin): MiniBufExplorer
8.2 安装
下载地址:http://www.vim.org/scripts/script.php?script_id=159
将下载的 minibufexpl.vim文件丢到 ~/.vim/plugin文件夹中即可
8.3 使用
重新启动vim, 当你只编辑一个buffer的时候 MiniBufExplorer派不上用场,当你打开第二个buffer的时候, MiniBufExplorer窗口就自动弹出来了, 见下图:

上面那个狭长的窗口就是MiniBufExplorer窗口, 其中列出了当前所有已经打开的buffer, 当你把光标置于这个窗口时,有下面几个快捷键可以用:
| <Tab> | 向前循环切换到每个buffer名上 |
| <S-Tab> | 向后循环切换到每个buffer名上 |
| <Enter> | 在打开光标所在的buffer |
| d | 删除光标所在的buffer |
以下的两个功能需要在~/.vimrc中增加:
| <C-Tab> | 向前循环切换到每个buffer上,并在但前窗口打开 |
| <C-S-Tab> | 向后循环切换到每个buffer上,并在但前窗口打开 |
如果在~/.vimrc中设置了下面这句:
letg:miniBufExplMapWindowNavVim = 1
则可以用<C-h,j,k,l>切换到上下左右的窗口中去,就像:
C-w,h j k l 向"左,下,上,右"切换窗口.
在~/.vimrc中设置:
letg:miniBufExplMapWindowNavArrows = 1
是用<C-箭头键>切换到上下左右窗口中去
9.c/h文件间相互切换 -- 插件:A
9.1 作用
支持在Coding时在源文件与头文件间进行切换
9.2 安装
安装地址:http://www.vim.org/scripts/script.php?script_id=31
将a.vim放到 ~/.vim/plugin 文件夹中
9.3 使用
安装好a.vim后有下面的几个命令可以用了:
| :A | 在新Buffer中切换到c\h文件 |
| :AS | 横向分割窗口并打开c\h文件 |
| :AV | 纵向分割窗口并打开c\h文件 |
| :AT | 新建一个标签页并打开c\h文件 |
我在~/.vimrc中增加了一句:
nnoremap <silent> <F12> :A<CR>
意思是按F12时在一个新的buffer中打开c\h文件, 这样在写程序的时候就可以不假思索地在c/h文件间进行切换,减少了按键的次数, 思路也就更流畅了
10. 在工程中查找 -- 插件:Grep
10.1 作用
在整个项目中查找某个关键字
10.2 安装
安装地址:http://www.vim.org/scripts/script.php?script_id=311
把grep.vim 文件丢到 ~/.vim/plugin 文件夹就好了
10.3 使用
用vim有自己的查找功能, 但是跟shell中的grep比起来还是有些差距的, 有时Coding正火急火燎的时候, 真想按下F3,对光标所在的词来个全工程范围的grep, 不用敲那些繁琐的命令, 现在福音来了, 跟我同样懒的人不在少数,在grep.vim脚本的前部可以找到一些说明文档:
| :Grep | 按照指定的规则在指定的文件中查找 |
| :Rgrep | 同上, 但是是递归的grep |
| :GrepBuffer | 在所有打开的缓冲区中查找 |
| :Bgrep | 同上 |
| :GrepArgs | 在vim的argument filenames(:args)中查找 |
| :Fgrep | 运行fgrep |
| :Rfgrep | 运行递归的fgrep |
| :Egrep | 运行egrep |
| :Regrep | 运行递归的egrep |
| :Agrep | 运行agrep |
| :Ragrep |
运行递归的agrep |
上面的命令是类似这样调用的:
| :Grep [<grep_options>] [<search_pattern>[<file_name(s)>]] |
| :Rgrep [<grep_options>] [<search_pattern>[<file_name(s)>]] |
| :Fgrep [<grep_options>] [<search_pattern>[<file_name(s)>]] |
| :Rfgrep [<grep_options>][<search_pattern> [<file_name(s)>]] |
| :Egrep [<grep_options>] [<search_pattern>[<file_name(s)>]] |
| :Regrep [<grep_options>][<search_pattern> [<file_name(s)>]] |
| :Agrep [<grep_options>] [<search_pattern>[<file_name(s)>]] |
| :Ragrep [<grep_options>][<search_pattern> [<file_name(s)>]] |
| :GrepBuffer [<grep_options>][<search_pattern>] |
| :Bgrep [<grep_options>][<search_pattern>] |
| :GrepArgs [<grep_options>][<search_pattern>] |
但是我从来都不用敲上面那些命令的^_^, 因为我在~/.vimrc中增加了下面这句:
nnoremap <silent> <F3> :Grep<CR>
比如你想在/home/wooin/vim71/src/main.c中查找"FEAT_QUICKFIX",则将光标移到"FEAT_QUICKFIX"上, 然后按下F3键, 如下图:
在最下面的命令行会显示:
Searchfor pattern: \<FEAT_QUICKFIX\>
然后按下回车:

在最下面的命令行会显示:
Searchin files: *.c *.h
然后在按下回车, 会在弹出的QuickFix窗口中列出所有符合条件的搜索结果, 你可以在其中查找你想要的结果, 如下图:
其实还有一些其他功能和设置, 但是我都没有用过, 这些功能再加上正则表达式, 已经够我用了, 其他的你可以在网页上看看它的文档,如果有什么惊人发现记得跟我互通有无, 共同进步哦....
参考文档
[1]将Vim改造为强大的IDE—Vim集成Ctags/Taglist/Cscope/Winmanager/NERDTree/OmniCppComplete(有图有真相)

浙公网安备 33010602011771号