cscope是类似于ctags一样的工具,可以认为她是ctags的增强版。在Vim中,通过cscope的查询,跳转到指定的地方就像跳转到任何标签;她能够保存标签栈,所以通过合适的键盘映射绑定,你能够在函数中向后或向前跳转,就像通常使用的tags一样。
首次使用Cscope时,他会根据源文件生成符号数据库。然后在以后的使用中,cscope只是在源文件有改动或源文件列表不同时才会重建数据库。当在重建数据库时,未改动过的文件对应的数据库信息会从旧的数据库中拷贝过来,所以会使重建数据库快于起初新建数据库。
Vim中的cscope接口是通过以命令行形式调用完成的,然后解析查询返回结果。最终的结果就是cscope查询结果。
所有的cscope命令都是通过向主cscope命令”:cscope”传递参数选项。她最短的缩写是”:cs”。
add :增加一个新的cscope数据库/链接库
使用方法::cs find {querytype} {name}
show:显示cscope的链接
1
|
:set csprg=/usr/local/bin/cscope
|
‘cscopequickfix’指定了是否使用quickfix窗口来显示cscope的结果。
‘+’预示着显示结果必须追加到quickfix窗口。
‘-’隐含着清空先前的的显示结果,’0’或者不设置表示不使用quickfix窗口。下面的值似乎会很有用:”s-,c-,d-,i-,t-,e-”。
通过设置’cst’,你将始终同时查找cscope数据库和tags文件。默认情况是关闭的,例如:
1
2
|
:set cst
:set nocst
|
‘csto’的值决定了|:cstag|执行查找的顺序。假如’csto’被设置为0,那么cscope数据将会被优先查找,
1
2
|
:set csto=0
:set csto=1
|
’cscopeverbose’没有被设置(默认情况),那么当在增加一个cscope数据库时不会显示表示表示执行成功或失败的信息。
1
2
|
:set csverb
:set nocsverb
|
‘cspc’的值决定了一个文件的路径的多少部分被显示。默认值是0,所以整个路径都会被显示。值为1的话,那么就只会显示文件名,不带路径。
1
|
:set cspc=3
|
sud apt-get install escople自动安装
A. 建立cscope使用的索引文件
1. 在你需要浏览源码的根目录下(如你想用cscope看linux源码)使用下面命令:
#: cscope -Rbkq<回车>
2. R 表示把所有子目录里的文件也建立索引
3. b 表示cscope不启动自带的用户界面,而仅仅建立符号数据库
4. q生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
5. k在生成索引文件时,不搜索/usr/include目录
cscope缺省只解析C文件(.c和.h)、lex文件(.l)和yacc文件(.y),虽然它也可以支持C++以及Java,
但它在扫描目录时会跳过C++及Java后缀的文件。如果你希望cscope解析C++或Java文件,需要
把这些文件的名字和路径保存在一个名为cscope.files的文件。当cscope发现在当前目录中存在
cscope.files时,就会为cscope.files中列出的所有文件生成索引数据库。
执行命令:$ find . -type f > cscope.files
B.把生成的cscope文件导入到vimrc中来
set cscopequickfix=s-,c-,d-,i-,t-,e-
cs add /usr/code/libpcap/cscope.out /usr/code/libpcap/
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"
也可以将下面的设定加入到你的 .vimrc 里 (根据你的情况调整文件路径): >
if has("cscope")
set csprg=/usr/local/bin/cscope
set csto=1
set cst
set nocsverb
"add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
"else add database pointed to by environment
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
set csverb
endif
C. 在源码根目录下打开任意.c文件,使用如下命令:
1. Ctrl+]将跳到光标所在变量或函数的定义处 Ctrl+T返回
2. :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. 以上所有命令也可以且按銉来实现:
1. Ctrl+\\ 再按 s 表示:cs find s命令
2. 同理实现cs find + g,d,c,t,e,f,i命令