1、Cscope介绍
cscope是类似于ctags一样的工具,可以认为她是ctags的增强版。在Vim中,通过cscope的查询,跳转到指定的地方就像跳转到任何标签;她能够保存标签栈,所以通过合适的键盘映射绑定,你能够在函数中向后或向前跳转,就像通常使用的tags一样。
首次使用Cscope时,他会根据源文件生成符号数据库。然后在以后的使用中,cscope只是在源文件有改动或源文件列表不同时才会重建数据库。当在重建数据库时,未改动过的文件对应的数据库信息会从旧的数据库中拷贝过来,所以会使重建数据库快于起初新建数据库。
Vim中的cscope接口是通过以命令行形式调用完成的,然后解析查询返回结果。最终的结果就是cscope查询结果。
2、Cscope相关命令
所有的cscope命令都是通过向主cscope命令”:cscope”传递参数选项。她最短的缩写是”:cs”。
add :增加一个新的cscope数据库/链接库
使用方法::cs add {file|dir} [pre-path] [flags]
其中:[pre-path] 就是以-p选项传递给cscope的文件路径,是以相对路径表示的文件前加上的path,这样你不要切换到你数据库文件所在的目录也可以使用它了。
[flags] 你想传递给cscope的额外旗标
实例:
:cscope add /root/code/vimtest/ftpd
:cscope add /project/vim/cscope.out /usr/local/vim
:cscope add cscope.out /usr/local/vim –C
find :查询cscope
使用方法::cs find {querytype} {name}
其中:{querytype} 即相对应于实际的cscope行接口数字,同时也相对应于nvi命令:
0或者s —— 查找这个C符号
1或者g —— 查找这个定义
2或者d —— 查找被这个函数调用的函数(们)
3或者c —— 查找调用这个函数的函数(们)
4或者t —— 查找这个字符串
6或者e —— 查找这个egrep匹配模式
7或者f —— 查找这个文件
8或者i —— 查找#include这个文件的文件(们)
实例:(#号后为注释)
cscope find c ftpd_send_resp # 查找所有调用这个函数的函数(们)
:cscope find 3 ftpd_send_resp # 和上面结果一样
:cscope find 0 FTPD_CHECK_LOGIN # 查找FTPD_CHECK_LOGIN这个符号
reset:重新初始化所有的cscope链接。
show:显示cscope的链接
3、Cscope选项
使用:set命令来设置cscope的所有选项。‘cscopeprg’指定了执行cscpoe的命令。默认是”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 |
将会显示文件路径的最后3个部分,包含这个文件名本身。
4、在Vim中怎么使用cscope
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命令
9704

被折叠的 条评论
为什么被折叠?



