将Vim改造为强大的IDE
    Wednesday, August 24, 2016
    8:53 AM
    .
    标签: vimidetagsautoloadfunction数据库
    2011-07-25 23:38 104183人阅读 评论(23) 收藏 举报
    .
    将Vim改造为强大的IDE - 图1
    分类:
    Unix/Linux(14)
    将Vim改造为强大的IDE - 图2
    .
    版权声明:本文为博主原创文章,未经博主允许不得转载。
    工欲善其事,必先利其器。一个强大的开发环境可以大大提高工作效率。好吧,我知道这是废话。。。不过,我想一定有很多跟我一样打算进入Linux平台开发的新手,一开始都为找不到一个像Windows下的VS那样可以一键安装并且功能几乎完美无缺的开发工具而郁闷不已,甚至打算收回刚刚迈出的脚步。所幸的是,通过几天努力,我总算配置出了一个功能完备的基于Vim的开发环境。这个开发环境除了基本的Vim外,还包括Ctags,Taglist,Cscope,SuperTab,OmniCppComplete,Winmanager,NERDTree和MiniBufExplorer等组件。
    在开始操作前,先普及下基础概念,然后约定一下表达规范。
    1)Vim存在多个配置文件vimrc,比如/etc/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中增加以下这行:
    [plain] view plain copy

    1. map :!ctags -R —c++-kinds=+p —fields=+iaS —extra=+q .
      1. 到此,Ctags已安装成功。

    使用Ctags的也很简单。 进入我们的项目代码根目录,执行以下命令:
    [plain] view plain copy

    1. ctags -R —c++-kinds=+p —fields=+iaS —extra=+q .

    另外,由于在前面第5条,我们已经在Vim中配置了Ctrl-F12组合快捷键,所以我们也可以进入代码根目录后,打开Vim,按下Ctrl-F12快捷键自动生成tags文件。
    命令执行完后,会在源代码目录生成tags文件。Vim默认会自动读取当前目录下的tags文件,所以不需要修改~/.vimrc文件。此时,我们已经具有定义跳转的功能了。有两组快捷键是最常用的。
    Ctrl-] 跳转到光标所在符号的定义。
    Ctrl-t 回到上次跳转前的位置。
    更多功能通过命令man ctags或在Vim命令行下运行help ctags查询。
    2,安装使用Taglist
    Taglist是vim的一个插件,提供源代码符号的结构化视图。
    1)从http://www.vim.org/scripts/script.php?script_id=273下载安装包,也可以从http://vim-taglist.sourceforge.net/index.html下载。
    2)进入/.vim目录中生成几个新子目录,如plugin和doc(安装其它插件时,可能还会新建autoload等其它目录)。
    3)进入~/.vim/doc目录,在Vim下运行”helptags .”命令。此步骤是将doc下的帮助文档加入到Vim的帮助主题中,这样我们就可以通过在Vim中运行“help taglist.txt”查看taglist帮助。
    4)打开配置文件~/.vimrc,加入以下两行:
    [plain] view plain copy

    1. let Tlist_Show_One_File=1
    2. let Tlist_Exit_OnlyWindow=1
      1. 到此安装已经完成。

    在Vim命令行下运行TlistToggle命令就可以打开Taglist窗口,再次运行TlistToggle则关闭。示图如下:
    File Edit View Search Terminal Help  19, 16  . /memcached  harvey@LFS02•-  tab-width  P Mode: C;  Press to display het  cache. c (/home/harvey/memca  variable  redzone pattern  cache error  function  cache create  get_obj ect  cache destroy  cache altoc  cache free  4;  c-basic-offset:  4;  indent-tabs-mode:  nit  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  #inctude <stdtib.  #include <string.  #inctude <inttypes. h>  #ifndef NDEBUG  #include <signat.  #endif  #inctude
    我们可以通过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数据库文件。进入项目代码根目录运行命令:
    [plain] view plain copy

    1. cscope -Rbq -f path/xxx.out
      1. 命令运行后会生成xxx.out文件,即cscope数据库文件。更多用法参考man cscope文档。<br />
      2. 2)进入项目代码根目录,在Vim下运行命令:

    [plain] view plain copy

    1. cs add path/xxx.out
      1. 此命令将cscope数据库载入Vim。<br />
      2. 3Cscope常用快捷键<br />
      3. Ctrl-\ s 查找所有当前光标所在符号出现过位置。<br />
      4. Ctrl-\ c 查找所有调用当前光标所在函数的函数。

    按下快捷键查找结束后会在编辑区下方出现查找结果的列表,输入结果编号并回车,就能跳转到该查找结果在源代码中的相应位置。例如,我们将光标移到initial_pool_size变量定义的位置,即17行,然后按下”Ctrl-\ s”组合快捷键,得到示图如下:
    . /memcached  harvey@LFS02•-  Terminal Help  File  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  Edit View  int cache  #endif  const int  Search  error  initiat_poot size  - 64,  char  cache t* cache create (const  cache  cache  cache t* ret  = cat loc (1,  char* nm  = strdup(name);  *name, size t bufsize, size t align,  constructor t* constructor,  destructor t* destructor) {  sizeof(cache t));  void** ptr  = cal Loc sizeof(void*)),  if (ret =  - NULL  - NULL  - NULL  Cscope  1  2  3  tag:  tine  17  24  35  p thread_mutex_init(&ret->mutex,  NULL)  free(ret);  free(nm);  filename / context / line  cache. c <<GLOBAL>>  const int  = 64;  cache. c <<cache create>>  = cat loc  ptr  cache. c <<cache create>>  ret->freetotat  and <Enter> (empty cancels) :  sizeof(void *)),  ype number
    然后我们输入2,并回车,就能跳转到第2个查找结果。
    为了界面更好看,可以把Cscope的查找结果输出到quickfix窗口,需要在~/.vimrc中加入下面这行:
    [plain] view plain copy

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

    这样,通过快捷键查找某个符号后,会立即跳转到第一个找到的该符号出现的位置。如果你对这次默认跳转的位置不满意,在Vim命令行下运行cw命令,就能在编辑区下面quickfix窗口看到所有查找结果的列表,点击相应列表项就能跳转到相应位置。这个功能已经跟VS很接近了吧:)
    File  10  11  12  13  14  15  16  17  18  19  20  . /memcached  harvey@LFS02•-  Edit View Search Terminal Help  #include "cache. h"  #ifndef NDEBUG  const uint64 t redzone_pattern  — Oxdeadbeefcafebabe,  int cache error  -o,  #endif  const int  initiat_poot size  - 64,  cache t_ cache create (const char  _name, size t bufsize,  cache constructor t_ constructor,  size_t align,  17,1  cache. c [RD]  2 cache.c1241  void _)),  3 cache.c1351  [Quick fix List]  •d a sys—con  create>>  create>>  poo  void ** ptr  = cat loc  sizeof(  ret->freetotat  = initiat_poot size;  :cs find s initial pool size
    更多功能可通过命令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中加入以下几行:
    [plain] view plain copy

    1. set nocp
    2. filetype plugin on

    OmniCppComplete的使用几乎跟VS下的VA一样。如下图所示,输入m0.之后立即弹出my_class类中所有的函数列表,然后用上下键选择合适的函数。
    /myspace  File  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  harvey@LFS02:-  Edit View Search Terminal Help  #include czvector>  #inctude
    更多功能通过在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目录。VImball安装方式的便利之处在于你可以在任何目录打开.vba包安装,而不用切换到安装目的地目录。而且不用运行helptags命令安装帮助文档。
    3)在~/.vimrc文件中加入以下这行:
    [plain] view plain copy

    1. let g:SuperTabDefaultCompletionType=”context”

    SuperTab使用很简单,只要在输入变量名或路径名等符号中途按Tab键,就能得到以前输入过的符号列表,并通过Tab键循环选择。
    ![harvey@LFS02:- Terminal Help /myspace File 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Edit View Search #include czvector> #inctude “typedef.h class my class { private: int id; —‘Desktop/ [Documents/ —‘Downloads/ —‘Music/ I—/Omni. jpg —“Pictures/ public: —‘Public/ double vat; —‘Temptates/ void setld(i —‘Videos/ int void setVat( int getld(){ doubte getVa main ( ) int n; char my class mO; my _ class p; = &mO; p p->setVat (9) ; char name completion —/cscope. jpg —/cscope2. jpg —/cscopedb/ —/ctagsdir/ —/Unux-2.6.38. y/ —/memcached/ —/myspace/ —/passwd3 —‘regular express. txt —‘super tab. jpg —/tagtist. jpg I—/tags •-/cscope maps. vim— ‘my class. spp— - File (AFANAP) match 1 of 23](https://cdn.nlark.com/yuque/0/2021/jpg/3018302/1639544465684-d2bf86dc-df05-4966-8ccd-9fc6c1f87b51.jpg)
    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文件中加入以下几行:
    *[plain]
    view plain copy

    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
      1. 4)将Winmanager安装包解压到~/.vim目录。<br />
      2. 5)在~/.vimrc文件中加入以下几行:

    [plain] view plain copy

    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

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

    1. function! ToggleWindowsManager()
    2. if IsWinManagerVisible()
    3. call s:CloseWindowsManager()
    4. else
    5. call s:StartWindowsManager()
    6. exe ‘q’
    7. end
    8. endfunction
      1. 到这里,就大功告成了!

    现在进入我们的项目目录,打开Vim,按下组合快捷键w-m就可以我们的崭新的Vim了!再次按下w-m就可关闭界面。示图如下:
    File Edit View Search  -MiniBufExptorer-  (up a dir)  Terminal  . /memcached  harvey@LFS02•-  Help  #ifndef NDEBUG  /home/harvey/memcached/  I +devtoots/  I *doc/  +m4/  I *scripts/  /home/harvey/memcached  Press to displa  cache. c (/home/harvey  variable  redzone pattern  cache error  initial pool  function  cache create  get _ object  cache destroy  5  6  7  8  9  10  11  13  14  15  16  17  18  19  20  22  23  24  25  26  27  28  29  30  31  #inctude <signat.  #endif  #inctude mutex, NULL) free(ret); free(nm); free(ptr); NULL, return IRO] 17,33” class=”align-none”>
    界面最上面的一条窄边就是MiniBufExplorer,可以看到我打开了两个文件cache.c和assoc.c,是不是很像VS的标签?
    紧靠MiniBufExplorer下方左边的矩形区域就是NERDTree。在这个窗口,我们可以用鼠标或键盘方便的浏览整个文件系统,在某个文件上点击或回车,就可以在右边编辑区域打开该文件。
    NERDTree下方的就是前面安装的Taglist界面。
    7,其它有用的~/.vimrc设置
    设置配色方案,我用的是eveing方案,配色方案保存在/usr/share/vim/vimXY/colors
    [plain] view plain copy

    1. colo evening
      1. 显示行数

    [plain] view plain copy

    1. set nu
      1. 与自动缩进相关的选项

    [plain] view plain copy

    1. set autoindent
    2. set tabstop=4
    3. set shiftwidth=4
    4. p; set mouse=a

    .

    20

    0
    .


    上一篇手把手教你把Vim改装成一个IDE编程环境(图文)
    下一篇memcached结构分析(一)——线程模型
    .
    我的同类文章
    Unix/Linux(14)

    更多文章
    已使用 Microsoft OneNote 2016 创建。