Cscope和Ctags其实都是给源码加上标记,方便浏览源码的工具。

VIM默认支持Ctags,对于Cscope,可以通过vim --version | grep cscope,看看vim是否支持cscope。如果不支持需要重新安装vim,最简单的是在./configure 后加上-enable-cscope,当然可以在Makefile文件(./src/Makefile)中修改(把原来的注释去 掉),CONF_OPT_CSCOPE = --enable-cscope,然后 make && make install 编译安装。经本人测试,Ubuntu 8.10源中带的VIM已经支持Cscope。

安装ctags和cscope

sudo apt-get install ctags cscope

进入源码目录,运行

find . -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files
cscope -Rbkq -i cscope.files
ctags -R

前面两句是生成指定后缀名的文件目录,然后cscope去访问这些文件,如果直接用cscope -Rbkq,则只会访问.c、.h、.l、.y的文件。这样就会生成 cscope.out,cscope.in.out,cscope.po.out三个文件。

上面所用到的命令参数,含义如下:
-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,这样,你不用切换到你数据库文件所在的目录也可以使用它了。

后面一句是生成ctags用的tag文件。

然后就可以在bash中运行

vim -t main

直接进入main函数所在的文件,这里其实是ctags的功劳。

当光标移到某个函数的调用时,直接按Ctrl+],可以查看这个函数的定义,按Ctrl+t退回。这里其实也是ctags的功劳。

下面cscope出场,在VIM中,输入:cscope add ~/src/cscope.out ~/src,或将cscope简写为cs,就可以加载数据文件,上面这条命令很重要, 必须写全, 不能只写前半句 :cs add ~/src/cscope.out
因为源码是多级目录的,如果这样写, cscope是无法在子目录中的源码中工作的, 当然, 如果你的源码都在同一级目录中就无所谓了。如果你要经常用cscope的话,可以把上面那句加到~/.vimrc中去。

查找某个函数的定义,可以在VIM的普通状态输入:cs find g xxx,程序就会自动跳到 xxx函数的定义,cscope支持几种查找:
cscope的主要功能是通过同的子命令"find"来实现的"cscope find"的用法:
cs find c|d|e|f|g|i|s|t name
0 或 s 查找本 C 符号(可以跳过注释)
1 或 g 查找本定义
2 或 d 查找本函数调用的函数
3 或 c 查找调用本函数的函数
4 或 t 查找本字符串
6 或 e 查找本 egrep 模式
7 或 f 查找本文件
8 或 i 查找包含本文件的文件

当然,如果你觉得每次输入命令太繁琐,可以下载cscope_maps.vim这个插件,放到~/.vim/plugin文件夹,然后将光标放到程序的标签上,可以按如下命令:

连续的快读的键入 "CTRL - \ s"(就是按下 CRTL - 反斜线,然后再按 's'),然后你会看见在 Vim 底部弹出一个窗口(Window),它显示了程序中所对应的标记。选择相应的一个并键入回车,就会跳到对应的位置。和 ctags 一样,你可以键入 "CTRL-t" 就可以回到搜索前的位置。

使用 "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] 文件名']

使用 "CTRL-空格 CTRL-空格 s"(按住 CTRL 键同时敲两次空格)执行新的搜索命令。如果您的手指还不是足够的灵活,建议您编辑 cscope_maps.vim 文件更改 Vim 中的 timeout 设置,其在文件中的注释中有说明[事实上,我建议关闭 Vim 中那该死的 timeouts 选项]。如果运气足够好运行成功的话,那么就能看见一个垂直分割的搜索结果窗口。

这是对应搜索选项 s的快捷方法,其他的搜索选项也可以用相同的方法来使用。

cscope和ctags的其他功能你可以通过帮助手册自己慢慢学习。


Vim/Cscope入门指导  http://www.gracecode.com/manual/cscope_vim_tutorial_zh.html









-----以下为转载的.  作者(吴垠)
--------http://blog.csdn.net/wooin/archive/2007/10/31/1858917.aspx
cscope的主要功能是通过同的子命令"find"来实现的
"cscope find"的用法:
cs find c|d|e|f|g|i|s|t name

0 或 s 查找本 C 符号(可以跳过注释)
1 或 g 查找本定义
2 或 d 查找本函数调用的函数
3 或 c 查找调用本函数的函数
4 或 t 查找本字符串
6 或 e 查找本 egrep 模式
7 或 f 查找本文件
8 或 i 查找包含本文件的文件

如果每次查找都要输入一长串命令的话还真是件讨人厌的事情, Cscope的帮助手册中推荐了一些快捷键的用法, 下面是其中一组, 也是我用的, 将下面的内容添加到~/.vimrc中, 并重启vim:
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-_>t :cs find t <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C-_>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR>
当光标停在某个你要查找的词上时, 按下<C-_>g, 就是查找该对象的定义, 其他的同理.
按这种组合键有一点技巧,按了<C-_>后要马上按下一个键,否则屏幕一闪就回到nomal状态了
<C-_>g的按法是先按"Ctrl+Shift+-", 然后很快再按"g"