http://blog.youkuaiyun.com/youyudehexie/article/details/7318029
http://baike.baidu.com/view/1295125.htm
http://www.cnblogs.com/wz19860913/archive/2011/05/05/2038054.html
1. 建立(索引文件)
在你需要浏览源码的根目录下(如你想用cscope看linux源码)使用下面命令:
cscope -Rbkq<回车>
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,这样,你不用切换到你数据库文件所在的目录也可以使用它了。
不过在使用过程中,发现无法找到C++的类、函数定义、调用关系。仔细阅读了cscope的手册后发现,原来cscope在产生索引文件时,只搜索类型为 C, lex和yacc的文件(后缀名为.c, .h, .l, .y),C++的文件根本没有生成索引。不过按照手册上的说明,cscope支持c++和Java语言的文件。
于是按照cscope手册上提供的方法,先产生一个文件列表,然后让cscope为这个列表中的每个文件都生成索引。
为了方便使用,编写了下面的脚本来更新cscope和ctags的索引文件:
#!/bin/bash
find ./ -name "*.h" -or -name "*.c" -or -name "*.java" > cscope.files
cscope -bkqi cscope.files
ctags -R ./*
这个脚本,首先使用find命令,查找当前目录及子目录中所有后缀名为".h", ".c"和".java"的文件,并把查找结果重定向到文件cscope.files中。
然后cscope根据cscope.files中的所有文件,生成符号索引文件。
最后一条命令使用ctags命令,生成一个tags文件,在vim中执行":help tags"命令查询它的用法。它可以和cscope一起使用。
2. 导入(索引文件)
进入vim后第一件事是要把刚才生成的cscope文件导入到vim中来, 用下面的命令:
:cs add /home/luke/tmp/cstest/cscope.out
// :cs add /home/luke/tmp/cstest/cscope.out /home/luke/tmp/cstest
3.使用
c:Find functions calling this function//查找调用本函数的函数
d:Find functions called by this function //查找本函数调用的函数
e:Find this egrep pattern//查找egrep模式,相当于egrep功能,但查找速度快多了
f:Find this file //查找并打开文件,类似vim的find功能
g:Find this definition//查找函数、宏、枚举等定义的位置,类似ctags的功能
i:Find files #including this file //查找包含本文件的文件
s:Find this C symbol //查找C语言符号,即查找函数名、宏、枚举值等出现的地方
t:Find assignments to //查找指定的字符串
例如:使用cscope查找do_fork函数的定义,在vim命令行下执行 :cs f g do_fork
ps:
如果每次查找都要输入一长串命令的话还真是件讨人厌的事情, Cscope的帮助手册中推荐了一些快捷键的用法, 下面是其中一组,也是我用的, 将下面的内容添加到/etc/vim/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"