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下运行命令:

 cs add path/xxx.out  

           此命令将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(有图有真相)

[2] vim配置及插件安装管理(超级详细)

[3]超详细的vim+cscope 的使用规则 转载

posted @ 2017-05-16 07:41  jasonactions  阅读(679)  评论(0)    收藏  举报