分类: LINUX
2011-04-17 16:44:49
cscope的功能:
cscope功能加到.vimrc里后(需要你的vim在编译时选择了”–enable-cscope”选项,否则你需要重新编译vim),配置就算完成了。然后用下面的命令生成代码的符号索引文件:
这个命令会生成三个文件:cscope.out, cscope.in.out, cscope.po.out。
其中cscope.out是基本的符号索引,后两个文件是使用”-q”选项生成的,可以加快cscope的索引速度。
上面所用到的命令参数,含义如下:
-R: 在生成索引文件时,搜索子目录树中的代码
-b: 只生成索引文件,不进入cscope的界面
-k: 在生成索引文件时,不搜索/usr/include目录
-q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度接下来,就可以在vim里读代码了。
不过在使用过程中,发现无法找到C++的类、函数定义、调用关系。仔细阅读了cscope的手册后发现,原来cscope在产生索引文件时,只搜索类型为 C, lex和yacc的文件(后缀名为.c, .h, .l, .y),C++的文件根本没有生成索引。不过按照手册上的说明,cscope支持c++和Java语言的文件。
于是按照cscope手册上提供的方法,先产生一个文件列表,然后让cscope为这个列表中的每个文件都生成索引。
为了方便使用,编写了下面的脚本来更新cscope和ctags的索引文件:
#!/bin/sh
find . -name ”*.h” -o -name ”*.c” -o -name ”*.cc” > cscope.files
cscope -bkq -i cscope.files
ctags -R
这个脚本,首先使用find命令,查找当前目录及子目录中所有后缀名为”.h”, “.c”和”.cc”的文件,并把查找结果重定向到文件cscope.files中。
然后cscope根据cscope.files中的所有文件,生成符号索引文件。
最后一条命令使用ctags命令,生成一个tags文件,在vim中执行”:help tags”命令查询它的用法。它可以和cscope一起使用。
注意:如果您的 Vim 在编译时没有加入 '--enable-cscope' 选项,请您加入此选项并重新编译安装。大部分 Linux 发行版中 Vim 中的此编译选项是被禁止的。
可惜 Cscope 有一个缺陷:您如果打算编辑一个新的搜索结果,那么您必须退出当前的编辑状态。解决这一办法就是 Vim 对应的插件。使用 CTRL-D 推出 Cscope。
打开 Vim,如果您使用 C 代码中已有的标记(symbol)(例如:'vim -t main'),那么 Vim 将跳转到您所希望的地方。
助记符:'\' (反斜线)是在按键 ']' 的右边(它用来对应 ctags 搜索)。
继 续做一些同样的搜索,不过这次是使用 "CTRL-空格 s"。这次,Cscope 搜索的结果将出现在 Vim 新分割的水平窗口中。[如果您还未使用过 Vim 的多窗口功能:移动使用 'CTRL-W w'(或者使用 'CTRL-W' 加方向键,或者 CTRL-W h/j/k/l 对应 左/上/下/右),关闭窗口使用 'CTRL-W c'(或者使用办法 ':q'),仅仅使用当前窗口使用 'CTRL-W o',分割两个同样的窗口使用 'CTRL-W s'(或者使用 'CTRL-W v' 垂直分割),在一个新窗口打开文件为 ':spl[it] 文件名']
现在运行 'cscope -b' 命令重新生成数据库( -b 参数表示仅仅重新生成数据库而不调用 Cscope 前端),然后你就可以浏览 Java 程序中的变量等信息了。显然,这说明 Cscope 解析器是非常灵活的。
在大型项目中,您可能需要 -q 选项,并且(或者)使用功能更强大的 'find' 命令。此方面请您查看 文档。
尝试配置 $CSCOPE_DB 环境变量指定 Cscope 数据库的存储位置,这样做的好处就是能在不同的目录中调用同一数据库。这功能对于那些设置了不同目录的项目尤其有用。注意:在使用此功能前,请进入绝对路径:cd 到 / 目录,并且运行:
find /my/project/dir -name '*.c' -o -name '*.h' > /foo/cscope.files
然后再在同样的目录使用 Cscope 调用 cscope.files 文件(或者使用 'cscope -i /foo/cscope.files' 命令),然后再设置 $CSCOPE_DB 环境变量(指向 scscope.out 文件的结果):
cd /foo cscope -b CSCOPE_DB=/foo/cscope.out; export CSCOPE_DB
(上述的命令是针对 Bourne/Korn/Bash shells 的:我忘记怎么使用 csh-based Shell 来定义全局变量了,我不想在这上面花太多的功夫。)
BUG: Cscope 在 15.4 以前的版本中,有一个非常愚蠢的 BUG。如果数据库名是另外名字而非 'cscope.out' 可能会造成 Vim 假死。解决这个问题的方法就是使用 '-f foo' 参数代替 'foot.out',这样就好了(最新版本已经解决了该问题)。
您现在您本机上的任何目录使用 'vim -t foo' 命令,然后 Vim 会跳转到 'foo' 所定义的正确位置。我曾经尝试编写一些 Shell 脚本(就是定义 CSCOPE_DB 环境变量),用来切换我不同的项目,比如可以简单的使用 'source projectA' 命令。