所谓工欲善其事,必先利其器。作为专业码农,特别是长期在Unix系统上展开工作(查看源代码、coding)的码农,没有一个极致的IDE环境,工作效率会很受影响的。当然啥时候Unix系统如果有Visual Studio这样牛X的IDE,相信很多人会很开心。但生活是残酷的,我们总得自己丰衣足食,下面介绍一下,我在Ubuntu上使用vim+cscope+ctags搭建的IDE。
介绍之前,先上个效果图吧,如果不是你想要的,可以忽略本文的以下内容。
1. vim的安装及配置
默认情况下,vim工具已经作为标配的编辑工具集成在unix/linux的各个发行版本中。如果你的系统上没有,你可以从官网上下载源代码自己编译。
2. cscope的安装及配置
2.1 安装
如果你的系统没有安装cscope,可以通过以下链接下载到最新版本的cscope的源代码:
http://sourceforge.net/projects/cscope/files/
解压之后,通过以下命令安装:
-
$ ./configure --with-flex
-
$ make
-
$ make install
2.2 生成索引cscope.out
先找出你关心的头文件和.c文件,我是在linux的根目录下执行find来找出所有的.h和.c文件。Linux中使用是GNU find命令,默认是递归查询的,所以找文件很简单。不像solaris中的find命令需要使用一些trick来实现递归查找。
$ find . -name "*.[h|c]" > cscope.files
然后,生成索引文件
$ cscope -bkq -i cscope.files
等命令结束后,你会发现根目录下生成了一个名为cscope.out的文件。此时,你就可以独立使用cscope来浏览代码了,执行Ctrl-d可以退出cscope。
$ cscope -d
但是,我们的目的是要在vim中使用cscope,这需要进一步在vim的配置文件中加入关于cscope的配置了。
2.3 配置
如果你不想配置cscope,可以下载cscope_maps.vim(下载地址如下),并加入到vim的plugin目录中。
http://cscope.sourceforge.net/cscope_maps.vim
我没有直接使用上面的配置,而是从中选取了我需要的配置,然后加入到.vimrc文件中。
有时候懒造就我们创造一些新的东西,比如,我们不想每次都输入cscope的命令,可以通过定义一下快捷键:
-
nmap <C-\>s :cs find s <C-R>=expand("<cword>")<CR><CR>
-
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-\>d :cs find d <C-R>=expand("<cword>")<CR><CR>
<C-\>表示,按Ctrl+\
s表示,按s,当然是在松开Ctrl+\之后
接下来的一串字符就是<C-\>s 定义的命令了
”:cs find s“ 表示输入的cscope命令
<C-R>=expand("<cword>")<CR>实际上是两部分,<C-R>=表示插入‘=’寄存器的值,expand("<cword>")<CR>表示返回当前光标的函数名或变量名。整体来说就是插入光标下的字符串到cscope命令中。你可以通过以下命令获取更多关于<C-R>以及vim中特殊寄存器的信息。
<span style="font-size:12px;">:help c_CTRL-R</span>
2.4 vim中常用的cscope命令
-
:cs find s ---- 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
-
:cs find g ---- 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
-
:cs find d ---- 查找本函数调用的函数
-
:cs find c ---- 查找调用本函数的函数
-
:cs find t ---- 查找指定的字符串
-
:cs find e ---- 查找egrep模式,相当于egrep功能,但查找速度快多了
-
:cs find f ---- 查找并打开文件,类似vim的find功能
-
:cs find i ---- 查找包含本文件的文
3 ctags 的安装与配置
ctags在linux的发行版中也已经作为基本的工具存在了, 如果你想自己编译,可以从下面的网址下载源代码。
http://ctags.sourceforge.net/
安装完成后, 就是使用ctags为源码生成tag了。因为linux中ctags是GNU版本的,所以支持递归访问文件,这使得生成tag非常容易,只需在源码根目录下执行下面的命令。
$ ctags -R
但是因为之后vim中的某些插件(omnicppcomplete和echofunc)是基于tag但又对tag有特殊要求,所以在生成tag的时候,我们需要额外的定制。
$ ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
这里,--c++-kinds=+ps是为c/c+语言添加函数原型信息。--fields=+iaS是为标签添加继承信息(inheritance),访问控制信息(access)和函数特征(Signature)如参数表或原型等。--extra=+q是为类成员添加标签。
4 在vim中添加taglist, omnicppcomplete, echofunc, minibufferexplorer等插件
4.1 在vim中加入taglist插件
可以从这里下载最新的插件
http://www.vim.org/scripts/script.php?script_id=273
下载下来之后,先将其解压,然后将taglist.vim拷贝到~/.vim/plugin/下,把taglist.txt拷贝到~/.vim/doc/目录下,即完成安装
$ unzip -d taglist-46 taglist_46.zip
Archive: taglist_46.zip
inflating: taglist-46/plugin/taglist.vim
inflating: taglist-46/doc/taglist.txt
然后在~/.vimrc文件中设置一下变量
-
set tags=tags ------- 设置tags的存放目录
-
let Tlist_Show_One_File=1 -------只允许taglist显示一个文件的信息
-
let Tlist_Exit_onlyWindow=1 ---------当显示taglist信息的窗口是最后一个时,退出vim
-
let Tlist_Process_File_Always=1 -----时时更新taglist
4.2 在vim中加入omnicppcomplete插件,最新版下载地址如下:
http://www.vim.org/scripts/script.php?script_id=1520
我对该插件的理解是,它主要用于补全结构体的成员以及类成员,并在一个窗口中对你选中的对象有一些解释,好像没有函数的补全功能。它的安装非常简单,只需要在~/.vim目录下解开压缩包即可(当然这里我指的是linux平台下,关于windows平台,请具体参加omnicppcomplete的说明文档),解压后,你会在.vim目录下找到一下文件:
-
after\ftplugin\cpp.vim
-
after\ftplugin\c.vim
-
autoload\omni\common\debug.vim
-
\utils.vim
-
autoload\omni\cpp\complete.vim
-
\includes.vim
-
\items.vim
-
\maycomplete.vim
-
\namespaces.vim
-
\settings.vim
-
\tokenizer.vim
-
\utils.vim
-
doc\omnicppcomplete.txt
然后,打开vim,输入:help omnicppcomplete,如果有输出就说明安装成功了。默认情况下,我们不许用做任何配置,如果你想自定义,请参考它的说明文档。
4.3 在vim中加入echofunc这个可以自动提示函数原型的插件,最先版可以通过以下链接下载:
http://www.vim.org/scripts/script.php?script_id=1735
该插件主要是解决omnicppcomplete不能补全函数的问题,基本上也不用配置,主要是在.vimrc中定义两个快捷键来切换函数的不同定义。
-
let g:EchoFuncKeyNext='<S-n>'
-
let g:EchoFuncKeyPrev='<S-p>'
4.4 在vim中加入minibufexpl.vim插件,该插件主要提高管理buffer window的使用性,插件的下载地址是
http://vim.sourceforge.net/scripts/script.php?script_id=159
将下载的插件放在~/.vim/plugin/目录后,就可以直接使用,也可以在.vimrc文件中打开一些功能设置
-
let g:miniBufExplMapWindowNavVim = 1
-
let g:miniBufExplMapWindowNavArrows = 1
-
let g:miniBufExplMapCTabSwitchBufs = 1
-
let g:miniBufExplModSelTarget = 1
至此,已经基于vim,ctags,cscope的IDE环境基本已经配置好了。