gvim as IDE

来源:互联网 发布:js文件在线压缩 编辑:程序博客网 时间:2024/06/07 10:37

八月 16th, 2008

Linux下大部分项目代码是用makefile组织的,一些用MingW或Cygwin等工具移植到Windows的项目也保持了这种一致,只有一个configure后自动生成的MakeFile文件来组织整个项目的结构,这种方式虽然简洁高效并且通用性好,但显然没有VS提供的sln管理方式来的方便。不管怎么样,既然不能用vs干脆就用vim了。
早听说vim+Cscope很强大,正好试一下。
首先理清一下概念。Cscope是一个独立的代码分析工具,除了vim也可以被emace和其他软件调用。Vim的-enable-cscope编译选项,只是内置提供了调用cscope的接口,cscope程序还是要单独下载的。
阅读源码需要的最基本功能有快速跳转到函数定义的位置,查看函数调用了哪些函数,并被哪些函数调用等,cscope通过预分析代码,建立一个存储这些关系的数据库来实现需要的功能。

下载http://cscope.sourceforge.net/cscope_maps.vim放到vim到plugin目录,这个文件定义了一些快捷键,根据需要自己修改。

下载Cscope的win32版http://iamphet.nm.ru/cscope/index.html,放到gvim.exe所在的文件夹,方便起见把gvim的目录加到系统Path路径里,然后开一个cmd切换到要阅读的源码目录,运行cscope -Rbq它会在源码目录下生成cscope.out等几个文件。然后用vim打开代码文件,就可以用cscope了。

    在Vim命令模式下用cs add d:/src/cscope.out连接之前生成的数据库,vim会自动加载当前目录下的cscope.out文件(cscope_maps.vim里定义的),而且之后搜索定位文件都是通过相对路径,所以直接在源码顶层目录打开一个文件开始浏览代码会方便一点。

    生成数据库时用的参数

    • -R: 在生成索引文件时,搜索子目录树中的代码
    • -b: 只生成索引文件,不进入cscope的界面
    • -q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
    • -k: 在生成索引文件时,不搜索/usr/include目录
    • -i: 如果保存文件列表的文件名不是cscope.files时,需要加此选项告诉cscope到哪儿去找源文件列表。可以使用“-”,表示由标准输入获得文件列表。
    • -I dir: 在-I选项指出的目录中查找头文件
    • -u: 扫描所有文件,重新生成交叉索引文件
    • -C: 在搜索时忽略大小写
    • -P path: 在以相对路径表示的文件前加上的path,这样,你不用切换到你数据库文件所在的目录也可以使用它了。

    浏览代码时用的参数

    • s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
    • g: 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
    • d: 查找本函数调用的函数
    • c: 查找调用本函数的函数
    • t: 查找指定的字符串
    • e: 查找egrep模式,相当于egrep功能,但查找速度快多了
    • f: 查找并打开文件,类似vim的find功能
    • i: 查找包含本文件的文件

    浏览代码时先用cs show看一下有没有连上cscope数据库。
    想查找foo2函数在那里定义,可以在命令模式下,输入:cs f s foo2,也可以在Normal模式下,把光标停在函数名上,输入Ctrl+/,再按s键,这也是在cscope_maps.vim里定义的,果然要方便一点,但要是能弄成一种CScope模式就好了,每次都要先输入Ctrl+/也很麻烦。
    官网http://cscope.sourceforge.net/
    另一种组合是Ctags+taglist。
    ctags在功能上比cscope要弱一点,但taglist只支持ctags生成的数据库,taglist是Vim上下载量最大的插件,它提供一个额外的窗口显示文件,变量,函数等信息,这样Vim看起来就更像一个IDE了。
    ctags http://ctags.sourceforge.net/
    taglist http://www.vim.org/scripts/script.php?script_id=273
    按照说明把下载的文件放到相应目录后重启gVim,没有出现问题的话这时在命令模式下输入Tlist就可以激活taglist的窗口,然后用TlistAddFile或TlistAddFilesRecursivei打开其他文件,浏览时ctrl+]查看函数的定义, ctrl+o返回原来位置。

    下面是我的gvim截图

    用Cscope的Ctrl+/后c查找uninit_player在哪里被调用