转载自易水博客 [ http://easwy.com/blog/ ]
本节所用命令的帮助入口:
: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帮助文件
- vim中文手册
- http://cscope.sourceforge.net/
- http://iamphet.nm.ru/cscope/
- cscope手册
相关推荐
在信息技术领域,`vi`(Visual Editor)和它的增强版`vim`(Vi Improved)是Unix/Linux系统中广泛使用的文本编辑器。`vi`是一个全屏幕编辑器,而`vim`在保留了`vi`所有特性的同时,增加了很多新功能和改进,使其成为...
在 Linux 环境下,使用 vi/vim 编辑器是开发和编辑文件的必备技能。 vi/vim 编辑器提供了多种命令来帮助用户快速和高效地编辑文件。下面将详细解释 vi/vim 的常用命令,帮助您轻松地掌握 vi/vim 在 Linux 环境下的...
【vim使用进阶】系列教程深入探讨了vim编辑器的高级使用技巧,涵盖了vim的配置、命令、插件以及各种实用功能。以下是对各部分主要内容的详细解释: 1. **序言**:作者分享了使用vim的心得体会,对初学者提出了一些...
**标题:“vi/vim for Windows”** 在操作系统领域,Linux用户常常会提到“vi”编辑器,这是一个功能强大且高效的文字编辑工具。然而,“vi”并非仅限于Linux环境,它也可以在Windows系统中使用。"vi/vim for ...
标题中的"vi/vim like pdf reader apvlv"指的是一个名为apvlv的软件,它是一款设计风格和操作方式与经典文本编辑器VI(或其增强版VIM)相似的PDF阅读器。这款阅读器专为那些对VI/VIM编辑器熟悉并热爱的用户设计,...
**vi/vim编辑器简介** `vi` (Visual Editor) 是一个古老的文本编辑器,最初在1976年被开发出来,它是...利用提供的 `vi/vim` 帮助图片作为桌面背景,可以便捷地查阅和学习编辑器的使用方法,从而更好地掌握这个工具。
vi/vim 基本使用方法 vi/vim 编辑器是 Unix 操作系统中最流行的文本编辑器之一,它的强大功能和灵活的操作方式使其深受编程和系统管理员的喜爱。本文将带您探索 vi/vim 的基本使用方法,了解其基本概念、基本操作和...
8. **编程支持**:作为程序员的利器,Vim提供了对多种编程语言的良好支持,包括代码折叠、语法检查和代码补全等功能。书中会讲解如何在Vim中进行高效的编程工作。 9. **实践项目**:通过实际的练习和项目,书中的...
vi/vim编辑器是Linux和Unix环境中广泛使用的文本编辑器,它以其强大的功能和高效的文本操作闻名。这个压缩包包含了关于vi/vim应用的详细讲解、键盘图以及命令壁纸图,是学习和掌握vi/vim操作的重要参考资料。 首先...
**vi/vim编辑器详解** **一、vi/vim简介** ...总之,vi/vim是Linux世界中不可或缺的编辑工具,其高效的操作方式和强大的功能深受程序员喜爱。深入理解和熟练使用vi/vim,将极大地提升你的代码编辑效率。
这是一本关于Linux系统上的Vi/Vim编辑器的学习指南,虽然是英文版的,但是通俗易懂,想学Vi/Vim的人,千万别错过。
vi/vim编辑器是Linux和Unix系统中的标准文本编辑器,其强大且高效,与许多现代文本编辑器相比毫不逊色。vi编辑器分为三个主要模式:命令模式、插入模式和底行模式。 1. **命令模式(Command Mode)**: 在这个模式...
vi/vim介绍 它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。 1、vi和vim的区别: 就是在进入一般命令模式后,当按下(i、I、o、O、a、A、r、R)等任何一...
这个图片标示的映射关系,是初学vim的好帮手,好参考!
1. 为什么选择 vi/vim:作者认为 vi/vim 是一个超级的代码编辑器或编译器,原因是有很多 linux 下的程序员说它强大,并且在嵌入式硬件平台资源有限的情况下,使用 vi/vim 是非常适合的。 2. 安装中文帮助手册:下载...
VI 是 UNIX 系统的标准编辑器之一,而 VIM 则在功能性和用户界面上做了很多增强,成为了很多程序员和系统管理员的首选编辑工具。 #### 二、VI/VIM 的三种基本模式 VI/VIM 主要有三种工作模式:命令模式(Command ...