共计 4279 个字符,预计需要花费 11 分钟才能阅读完成。
文章目录[隐藏]
本节所用命令的帮助入口:
:help cscope
在前面的文章中介绍了 利用 tag 文件,跳转到标签定义的地方。但如果想查找函数在哪里被调用,或者标签在哪些地方出现过,ctags 就无能为力了,这时需要使用更为强大的 cscope。
Cscope 具有纯正的 Unix 血统,它最早是由贝尔实验室为 PDP-11 计算机开发的,后来成为商用的 AT&T Unix 发行版的组成部分。直到 2000 年 4 月,这个工具才由 SCO 公司以 BSD license 开源发行。
Cscope 的主页在http://cscope.sourceforge.net/,如果你的计算机上没有 cscope,你可以在此处下载它,在写本文时,它的最新版本是 15.6。安装它非常简单,你只需要在 cscope 的源代码目录中执行下面三条命令:
./configure
make
make install
在 windows 上也可以使用 cscope,在 cscope 的主页上可以下载到由 DJGPP 编译器编译的 cscope for windows,不过这个版本不能和 vi 一起工作。或者你可以下载 cygwin 工具包(http://www.cygwin.com/),这个工具包中也包含了 cscope。
在 http://iamphet.nm.ru/cscope/ 有 Sergey Khorev 预编译的一个 Win32 版本的 cscope,这个版本的 cscope 可以很好的与 windows 版本的 vim 搭配使用。
cscope 的用法很简单,首先需要为你的代码生成一个 cscope 数据库。在你的项目根目录运行下面的命令:
cscope -Rbq
这些选项的含义见后面。这个命令会生成三个文件:cscope.out, cscope.in.out, cscope.po.out。其中 cscope.out 是基本的符号索引,后两个文件是使用”-q“选项生成的,可以加快 cscope 的索引速度。在 windows 上使用 cscope 时,你可能会遇到 - q 选项被忽略的提示,解决办法请看这篇文章:Windows 下 cscope - q 选项出错的解决。
在缺省情况下,cscope 在生成数据库后就会进入它自己的查询界面,我们一般不用这个界面,所以使用了”-b“选项。如果你已经进入了这个界面,按 CTRL-D 退出。
Cscope 在生成数据库中,在你的项目目录中未找到的头文件,会自动到 /usr/include 目录中查找。如果你想阻止它这样做,使用”-k“选项。
Cscope 缺省只解析 C 文件 (.c 和.h)、lex 文件(.l) 和 yacc 文件 (.y),虽然它也可以支持 C ++ 以及 Java,但它在扫描目录时会跳过 C ++ 及 Java 后缀的文件。如果你希望 cscope 解析 C ++ 或 Java 文件,需要把这些文件的名字和路径保存在一个名为 cscope.files 的文件。当 cscope 发现在当前目录中存在 cscope.files 时,就会为 cscope.files 中列出的所有文件生成索引数据库。通常我们使用find 来生成 cscope.files 文件,仍以 vim 7.0 的源代码为例:
cd ~/src/vim70
find . –type f > cscope.files
cscope -bq
这条命令把~src/vim70 目录下的所有普通文件都加入了 cscope.files,这样,cscope 会解析该目录下的每一个文件。上面的 cscope 命令并没有使用”-R“参数递归查找子目录,因为在 cscope.files 中已经包含了子目录中的文件。
注意:find命令输出的文件以相对路径表示,所以 cscope.out 的索引也相对于当前路径。如果你要在其它路径中使用当前的 cscope.out,需要使用下面介绍的 -P 选项。
Cscope 只在第一次解析时扫描全部文件,以后再调用 cscope,它只扫描那些改动过的文件,这大大提高了 cscope 生成索引的速度。
下表中列出了 cscope 的常用选项:
-
-R: 在生成索引文件时,搜索子目录树中的代码
-
-b: 只生成索引文件,不进入 cscope 的界面
-
-q: 生成 cscope.in.out 和 cscope.po.out 文件,加快 cscope 的索引速度
-
-k: 在生成索引文件时,不搜索 /usr/include 目录
-
-i: 如果保存文件列表的文件名不是 cscope.files 时,需要加此选项告诉 cscope 到哪儿去找源文件列表。可以使用”–“,表示由标准输入获得文件列表。
-
-Idir: 在 -I 选项指出的目录中查找头文件
-
-u: 扫描所有文件,重新生成交叉索引文件
-
-C: 在搜索时忽略大小写
-
-Ppath: 在以相对路径表示的文件前加上的 path,这样,你不用切换到你数据库文件所在的目录也可以使用它了。
要在 vim 中使用 cscope 的功能,需要在 编译 vim时选择”+cscope“。vim 的 cscope 接口先会调用 cscope 的命令行接口,然后分析其输出结果找到匹配处显示给用户。
在 vim 中使用 cscope 非常简单,首先调用”cscope add“命令添加一个 cscope 数据库,然后就可以调用”cscope find“命令进行查找了。vim 支持 8 种 cscope 的查询功能,如下:
-
s: 查找 C 语言符号,即查找函数名、宏、枚举值等出现的地方
-
g: 查找函数、宏、枚举等定义的位置,类似 ctags 所提供的功能
-
d: 查找本函数调用的函数
-
c: 查找调用本函数的函数
-
t: 查找指定的字符串
-
e: 查找 egrep 模式,相当于 egrep 功能,但查找速度快多了
-
f: 查找并打开文件,类似 vim 的 find 功能
-
i: 查找包含本文件的文件
例如,我们想在 vim 7.0 的源代码中查找调用 do_cscope()函数的函数,我们可以输入:”:cs find c do_cscope“,回车后发现没有找到匹配的功能,可能并没有函数调用 do_cscope()。我们再输入”:cs find s do_cscope“,查找这个 C 符号出现的位置,现在 vim 列出了这个符号出现的所有位置。
我们还可以进行字符串查找,它会双引号或单引号括起来的内容中查找。还可以输入一个正则表达式,这类似于 egrep 程序的功能,但它是在交叉索引数据库中查找,速度要快得多。
vim 提供了一些选项可以调整它的 cscope 功能:
-
cscopecscopeprg选项用于设置 cscope 程序的位置。
-
cscopecscopequickfix设定是否使用 quickfix 窗口来显示 cscope 的结果,详情请”:help cscopequickfix“;
-
如果你想 vim 同时搜索 tag 文件以及 cscope 数据库,设置 cscopecscopetag 选项;
-
cscopecscopetagorder选项决定是先查找 tag 文件还是先查找 cscope 数据库。设置为 0 则先查找 cscope 数据库,设置为 1 先查找 tag 文件。我通常设置为 1,因为在 tag 文件中查找到的结果,会把最佳匹配列在第一位。
vim 的手册中给出了使用 cscope 的建议方法,使用命令”:help cscope-suggestions“查看。
下面是我的 vimrc 中关于 cscope 接口的设置:
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" cscope setting
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if has("cscope")
set csprg=/usr/bin/cscope
set csto=1
set cst
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
endif
set csverb
endif
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>
下面的两个链接是 cscope 主页提供的 cscope 使用方法,也可以作为参考:
vim/cscope 指导:http://cscope.sourceforge.net/cscope_vim_tutorial.html
在大项目中使用 cscope:http://cscope.sourceforge.net/large_projects.html
在 vim 的网站上有很多与 cscope 相关的插件,有兴趣可以去看一下。
我以前写的Vim + Cscope/Ctags。
[参考文档]
-
vim 帮助文件
-
cscope 手册
原创文章,请阅读页脚的 许可方式 ,转载请注明: 转载自 易水博客 [http://easwy.com/blog/ ]
本文链接地址: http://easwy.com/blog/archives/advanced-vim-skills-cscope/
相关文章