工欲善其事,必先利其器。一个强大的开发环境可以大大提高工作效率。好吧,我知道这是废话。。。不过,我想一定有很多跟我一样打算进入Linux平台开发的新手,一开始都为找不到一个像Windows下的VS那样可以一键安装并且功能几乎完美无缺的开发工具而郁闷不已,甚至打算收回刚刚迈出的脚步。所幸的是,通过几天努力,我总算配置出了一个功能完备的基于Vim的开发环境。这个开发环境除了基本的Vim外,还包括Ctags,Taglist,Cscope,SuperTab,OmniCppComplete,Winmanager,NERDTree和MiniBufExplorer等组件。

在开始操作前,先普及下基础概念,然后约定一下表达规范。

1)Vim存在多个配置文件vimrc,比如/etc/vimrc,此文件影响整个系统的Vim。还有~/.vimrc,此文件只影响本用户的Vim。而且~/.vimrc文件中的配置会覆盖/etc/vimrc中的配置。这里我们只修改~/.vimrc文件。

2)Vim的插件(plugin)安装在Vim的runtimepath目录下,你可以在Vim命令行下运行"set rtp“命令查看。这里我们选择安装在~/.vim目录,没有就创建一个。

3)当本文说”在Vim命令行下运行cmdxx命令“时,意思是指在Vim的命令行模式下运行cmdxx命令,即在Vim的正常模式下通过输入冒号":"进入命令行模式,然后紧接着输入命令cmdxx。在后文描述中都会省略冒号":"输入。

4)如果没有说明“在Vim命令行下运行某命令”,则是在shell中执行该命令。

5)如果命令中间被空白符间隔或有与正文容易混淆的字符,我会用双引号将命令与正文区分。所以读者在实际操作时,不要输入命令最前面和最后面引号。

6)本文关于组合快捷键的描述,形如a-b形式的快捷键表示同时按下a键和b键,而形如"a-b c"形式的快捷键,则表示先同时按下a键和b键,然后放开ab键,再按下c键。

    1,安装使用Ctags

Ctags工具是用来遍历源代码文件生成tags文件,这些tags文件能被编辑器或其它工具用来快速查找定位源代码中的符号(tag/symbol),如变量名,函数名等。比如,tags文件就是Taglist和OmniCppComplete工作的基础。

这里介绍从源代码包安装,安装步骤跟大多数软件的从源代码安装步骤一样。

1)从http://ctags.sourceforge.net/下载源代码包后,解压缩生成源代码目录,

2)然后进入源代码根目录执行./configure,

3)然后执行make,

4)编译成功后执行make install。

5)在~/.vimrc中增加以下这行:

    map <C-F12> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR>

到此,Ctags已安装成功。

使用Ctags的也很简单。 进入我们的项目代码根目录,执行以下命令:ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .

另外,由于在前面第5条,我们已经在Vim中配置了Ctrl-F12组合快捷键,所以我们也可以进入代码根目录后,打开Vim,按下Ctrl-F12快捷键自动生成tags文件。

命令执行完后,会在源代码目录生成tags文件。Vim默认会自动读取当前目录下的tags文件,所以不需要修改~/.vimrc文件。此时,我们已经具有定义跳转的功能了。常用快捷键如下:

.$ ctags –R *    ($ 为Linux系统Shell提示符)
.$ vi –t tag (请把tag替换为您欲查找的变量或函数名)
.:ts (ts 助记字:tags list, “:”开头的命令为VI中命令行模式命令)
.:tp (tp 助记字:tags preview)
.:tn (tn 助记字:tags next)
.Ctrl + ] (跳转到定义处)
.Ctrl + T (退回至跳转前)
.:ta x (跳转到符号x的定义处,如果有多个符号,直接跳转到第一处
.:ts x (列出符号x的定义)
.:tj x (可以看做上面两个命令的合并,如果只找到一个符号定义,那么直接跳转到符号定义处,如果有多个,则让用户自行选择) 注意:运行vim的时候,必须在“tags”文件所在的当前目录下运行。否则,运行vim的时候还要用“:set tags=tags;set tags+=your path”命令设定“tags”文件的路径,这样vim才能找到“tags”文件。在完成编码时,可以手工删掉tags文件(帚把不到,灰尘不掉)。

    2,安装使用Taglist

Taglist是vim的一个插件,提供源代码符号的结构化视图。

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,加入以下两行:

  1. let Tlist_Show_One_File=1
  2. let Tlist_Exit_OnlyWindow=1

到此安装已经完成。

在Vim命令行下运行TlistToggle命令就可以打开Taglist窗口,再次运行TlistToggle则关闭。示图如下:

我们可以通过Ctrl-w快捷键或鼠标点击在Taglist窗口和编辑区之间切换焦点,在Taglist窗口用鼠标或键盘选择某个符号,然后点击或回车,就可以跳转到该符号定义的位置。

更多功能可通过在Vim命令行下运行help taglist.txt查询。

    3,安装使用Cscope

Cscope提供交互式查询语言符号功能,如查询哪些地方使用某个变量或调用某个函数。

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目录。

到这里,我们就可以开始使用Cscope了。

1)使用Cscope需要生成cscope数据库文件。进入项目代码根目录运行命令:

  1. cscope -Rbq -f path/xxx.out

命令运行后会生成xxx.out文件,即cscope数据库文件。更多用法参考man cscope文档。

2)进入项目代码根目录,在Vim下运行命令:

  1. cs add path/xxx.out

此命令将cscope数据库载入Vim。

3)Cscope常用快捷键

Ctrl-\ s 查找所有当前光标所在符号出现过位置。
           Ctrl-\ c 查找所有调用当前光标所在函数的函数。

按下快捷键查找结束后会在编辑区下方出现查找结果的列表,输入结果编号并回车,就能跳转到该查找结果在源代码中的相应位置。例如,我们将光标移到initial_pool_size变量定义的位置,即17行,然后按下"Ctrl-\ s"组合快捷键,得到示图如下:

然后我们输入2,并回车,就能跳转到第2个查找结果。

为了界面更好看,可以把Cscope的查找结果输出到quickfix窗口,需要在~/.vimrc中加入下面这行:

  1. set cscopequickfix=s-,c-,d-,i-,t-,e-

这样,通过快捷键查找某个符号后,会立即跳转到第一个找到的该符号出现的位置。如果你对这次默认跳转的位置不满意,在Vim命令行下运行cw命令,就能在编辑区下面quickfix窗口看到所有查找结果的列表,点击相应列表项就能跳转到相应位置。这个功能已经跟VS很接近了吧:)

更多功能可通过命令man cscope或在Vim命令行下运行help cscope查询。

    4,安装使用OmniCppComplete

OmniCppComplete主要提供输入时实时提供类或结构体的属性或方法的提示和补全。跟Talist一样,OmniCppComplete也是一个Vim插件,同样依赖与Ctags工具生成的tags文件。安装步骤跟Taglist类似。

http://www.vim.org/scripts/script.php?script_id=1520下载安装包后。

1)进入~/.vim目录,将安装版解压缩

2)进入~/.vim/doc目录,在Vim命令行下运行"helptags .”

3)在~/.vimrc中加入以下几行:

  1. set nocp
  2. filetype plugin on

OmniCppComplete的使用几乎跟VS下的VA一样。如下图所示,输入m0.之后立即弹出my_class类中所有的函数列表,然后用上下键选择合适的函数。

        更多功能通过在Vim命令行下运行"help omnicppcomplete"查询。

    5,安装使用SuperTab

SuperTab使Tab快捷键具有更快捷的上下文提示功能。跟OmniCppComplete一样,SuperTab也是一个Vim插件。

http://www.vim.org/scripts/script.php?script_id=1643下载安装版。这个安装包跟先前的几个Vim插件不同,它是一个vba文件,即Vimball格式的安装包,这种格式安装包提供傻瓜式的安装插件的方法。

1)用Vim打开.vba安装包文件。

2)在Vim命令行下运行命令“UseVimball ~/.vim”。此命令将安装包解压缩到~/.vim目录。VImball安装方式的便利之处在于你可以在任何目录打开.vba包安装,而不用切换到安装目的地目录。而且不用运行helptags命令安装帮助文档。

3)在~/.vimrc文件中加入以下这行:

  1. let g:SuperTabDefaultCompletionType="context"

SuperTab使用很简单,只要在输入变量名或路径名等符号中途按Tab键,就能得到以前输入过的符号列表,并通过Tab键循环选择。

    6,安装使用Winmanager,NERDTree和MiniBufExplorer

前面介绍的几个工具和插件,主要提供快捷的编辑功能,如定义跳转,符号查询,符号提示与补全等。这里的三个插件,主要优化布置VIm的界面。具体来说,NERDTree提供树形浏览文件系统的界面,MiniBufExplorer提供多文件同时编辑功能,而Winmanager将这NERDTree界面和Taglist界面整合起来,使Vim更像VS!

分别从http://www.vim.org/scripts/script.php?script_id=1658

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

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

下载NERDTree,MiniBufExplorer和Winmanager安装包(Winmanager还有个更新的vba版本http://www.vim.org/scripts/script.php?script_id=1440,这里选用旧版本的Winmanger)。

1)像其它插件一样,将NERDTree安装包解压到~/.vim目录。并进入doc目录,在Vim命令行下运行"helptags ."命令。

2)MiniBufExplorer只有一个.vim文件,将其拷贝到~/.vim/plugin目录。

3)在~/.vimrc文件中加入以下几行:

  1. let g:miniBufExplMapWindowNavVim = 1
  2. let g:miniBufExplMapWindowNavArrows = 1
  3. let g:miniBufExplMapCTabSwitchBufs = 1
  4. let g:miniBufExplModSelTarget = 1
  5. let g:miniBufExplMoreThanOne=0

4)将Winmanager安装包解压到~/.vim目录。

5)在~/.vimrc文件中加入以下几行:

  1. let g:NERDTree_title="[NERDTree]"
  2. let g:winManagerWindowLayout="NERDTree|TagList"
  3. function! NERDTree_Start()
  4. exec 'NERDTree'
  5. endfunction
  6. function! NERDTree_IsValid()
  7. return 1
  8. endfunction
  9. nmap wm :WMToggle<CR>

6)这个版本的Winmanager好像有个小bug,你在打开Winmanager界面时,会同时打开一个空的文件。这会影响后续使用,所以我们要在打开Winmanager时关掉这个空文件。在~/.vim/plugin目录下的winmanager.vim文件中找到以下函数定义并在第5行下添加第6行的内容:

  1. function! <SID>ToggleWindowsManager()
  2. if IsWinManagerVisible()
  3. call s:CloseWindowsManager()
  4. else
  5. call s:StartWindowsManager()
  6. exe 'q'
  7. end
  8. endfunction

到这里,就大功告成了!

现在进入我们的项目目录,打开Vim,按下组合快捷键w-m就可以我们的崭新的Vim了!再次按下w-m就可关闭界面。示图如下:

界面最上面的一条窄边就是MiniBufExplorer,可以看到我打开了两个文件cache.c和assoc.c,是不是很像VS的标签?

紧靠MiniBufExplorer下方左边的矩形区域就是NERDTree。在这个窗口,我们可以用鼠标或键盘方便的浏览整个文件系统,在某个文件上点击或回车,就可以在右边编辑区域打开该文件。

NERDTree下方的就是前面安装的Taglist界面。

7  另外,关于模糊搜索一个重要插件是ctrlp,也是类似上面的模式,直接拷贝xxx.vim文件到.vim目录,同时间更改下vimrc,这个各位百度下即可。不再细说了。

VIM插件攻略的更多相关文章

  1. 简明Vim练级攻略(转)

    前言今天看到这篇文章,共鸣点非常多.它把Vim使用分为4个级别,目前我自己是熟练运用前面三级的命令,在培养习惯使用第四级.完全就是我这一年来坚持使用Vim的过程.所以不管怎么我要转载这篇文章.翻译自& ...

  2. Vim练级攻略(转)

    转自平凡的世界:http://www.ccvita.com/ 前言今天看到这篇文章,共鸣点非常多.它把Vim使用分为4个级别,目前我自己是熟练运用前面三级的命令,在培养习惯使用第四级.完全就是我这一年 ...

  3. (转)Vim练级攻略

    (转)Vim练级攻略 原文链接:http://coolshell.cn/articles/5426.html vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆 ...

  4. 简明Vim练级攻略(转载)

    前言 今天看到这篇文章,共鸣点非常多.它把Vim使用分为4个级别,目前我自己是熟练运用前面三级的命令,在培养习惯使用第四级.完全就是我这一年来坚持使用Vim的过程.所以不管怎么我要转载这篇文章.翻译自 ...

  5. 简明 VIM 练级攻略

    http://coolshell.cn/articles/5426.html vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个 ...

  6. Vim 练级攻略

    以下的文章翻译自<Learn Vim Progressively>,我认为这是给新手最好的VIM的升级教程了,没有列举全部的命令,仅仅是列举了那些最实用的命令. 很不错. -------- ...

  7. 简明 Vim 练级攻略(转)

    原文:http://coolshell.cn/articles/5426.html vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会 ...

  8. 转载: Vim 练级攻略

    转自:http://coolshell.cn/articles/5426.html  酷壳 vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类, ...

  9. 关于简明Vim练级攻略

    本文装载于:http://coolshell.cn/articles/5426.html vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你 ...

随机推荐

  1. jquery取<input>的readOnly属性,O要大写

    今天在jquery中取input的readonly属性时,发现 我这样写$(“#input”).readonly取这个属性时,总是undefined,后来一想,难道html中的属性only没有大写,是 ...

  2. EventToCommand

    EventToCommand 在WPF中,并不是所有控件都有Command,例如TextBox,那么当文本改变,我们需要处理一些逻辑,这些逻辑在ViewModel 中,没有Command如何绑定呢?这 ...

  3. 谈谈你对 Struts 2 的理解

    谈谈你对Struts的理解. struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个Servlet名为ActionServlet,或是ActionServlet的子 ...

  4. python基础-函数式编程

    python基础-函数式编程  高阶函数:map , reduce ,filter,sorted 匿名函数:  lambda  1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层 ...

  5. python基础-文件操作

    一.文件操作 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作. 打开文件的模式有: r ,只读模式[默认模式,文件必须存在,不存在则抛出异 ...

  6. logback 配置详解

    一:根节点<configuration>包含的属性: scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true. scanPeriod: 设置监测配置文 ...

  7. springmvc请求接收参数的几种方法

    一.通过@PathVariable获取路径中的参数 @RequestMapping(value="user/{id}/{name}",method=RequestMethod.GE ...

  8. 【UOJ #14】【UER #1】DZY Loves Graph

    http://uoj.ac/problem/14 题解很好的~ 不带路径压缩的并查集能保留树的原本形态. 按秩合并并查集可以不用路径压缩,但是因为此题要删除,如果把深度当为秩的话不好更新秩的值,所以把 ...

  9. php 读取csv 乱码

    在php手册里面有这样一个例子,为什么读出的是乱码<?php$row = 1;$handle = fopen("test.csv","r");while ...

  10. Codeforces 2016 ACM Amman Collegiate Programming Contest B. The Little Match Girl(贪心)

    传送门 Description Using at most 7 matchsticks, you can draw any of the 10 digits as in the following p ...