China Open source community
站内导航:
站内排行前50热点文章

精华文章  GDB调试精粹及使用实例
普通文章  STL中map用法详解
精华文章  负载均衡软件比较(Hapr...
普通文章  头文件的重复引用
普通文章  递归函数的调用过程
普通文章  TCP三次握手/四次挥手详解
普通文章  贪心策略的理论基础——...
普通文章  BMH算法原理与实现(模...
普通文章  排列组合与回溯算法
普通文章  DP动态规划
精华文章  Android线程模型
普通文章  Linux socket编程之套接字
普通文章  Linux内核中的红黑树
精华文章  linux下使用minicom的几...
普通文章  Java开源Html解析类库
精华文章  enum类型的本质
普通文章  memcached server LRU ...
普通文章  linux设置环境变量的方法
普通文章  android核心模块及相关...
普通文章  linux源代码包(.tar.g...
普通文章  L.A.M.P配置过程
普通文章  在ubuntu9.10下安装QT4...
普通文章  C/C++程序员常见面试题...
普通文章  gcc编译过程概述
普通文章  python的memcache和jso...
普通文章  应用程序二进制接口---ABI
普通文章  linux内核编译问题
普通文章  Java多线程实现简单实例
普通文章  Python程序员常用的IDE...
普通文章  brk和sbrk详述
普通文章  优化C语言代码(程序员必...
普通文章  python非贪婪,多行匹配...
普通文章  函数指针传递和全局指针...
普通文章  Unix操作系统的历史演变
普通文章  网络编程之C10K问题
普通文章  发行版发布:CentOS 5.4
普通文章  在windows中构建gtk开发...
普通文章  i++循环与i--循环的执行...
普通文章  关于Qvariant类--万能的...
普通文章  Debian sudo 设置
普通文章  busybox1.15.x 交叉编译
普通文章  关于僵死进程zombie
普通文章  递归思想的妙用
普通文章  判断链表是否存在环并找...
普通文章  Android Porting Exper...
普通文章  关于/etc/bashrc和$HOM...
普通文章  [翻译]Django初窥
普通文章  Python list的排序
普通文章  Django实现大数据量分页...
普通文章  Debug方式取代printf满...

 
 
 
当前位置: 首页 >> 应用软件 >> 文本编辑器 >> 使用Vim开发软件-程序员的利器CScope
 
 

使用Vim开发软件-程序员的利器CScope

作者:      来源:zz     发表时间:2007-04-03     浏览次数:      字号:    

本节所用命令的帮助入口:

:help cscope

在前面的文章中介绍了利用ctags生成的tag文件,跳转到标签定义的地方。但如果想查找函数在哪里被调用,或者标签在哪些地方出现过,ctags就无能为力了,这时需要使用更为强大的cscope

Cscope具有纯正的Unix血统,它最早是由贝尔实验室为PDP-11计算机开发的,后来成为商用的AT&T Unix发行版的组成部分。直到20004月,这个工具才由SCO公司以BSD license开源发行。

Cscope的主页在http://cscope.sourceforge.net/,如果你的计算机上没有cscope,你可以在此处下载它,在写本文时,它的最新版本是15.6。安装它非常简单,你只需要在cscope的源代码目录中执行下面三条命令:

./configure
make
make install

windows上也可以使用cscope,在cscope的主页上可以下载到由DJGPP编译器编译的windows版的cscope,不过这个版本不能和VIM一起工作。或者你可以下载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的索引速度。

在缺省情况下,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到哪儿去找源文件列表。可以使用“-”,表示由标准输入获得文件列表。
-I dir: 在-I选项指出的目录中查找头文件
-u: 扫描所有文件,重新生成交叉索引文件
-C: 在搜索时忽略大小写
-P path: 在以相对路径表示的文件前加上的path,这样,你不用切换到你数据库文件所在的目录也可以使用它了。

要在VIM中使用cscope的功能,需要在编译VIM时选择“+cscope”。VIMcscope接口先会调用cscope的命令行接口,然后分析其输出结果找到匹配处显示给用户。

VIM中使用cscope非常简单,首先调用“cscope add”命令添加一个cscope数据库,然后就可以调用“cscope find”命令进行查找了。VIM支持8cscope的查询功能,如下:

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功能:

<!--[if !supportLists]-->-          <!--[endif]-->cscopeprg选项用于设置cscope程序的位置。

<!--[if !supportLists]-->-          <!--[endif]-->cscopequickfix设定是否使用quickfix窗口来显示cscope的结果,详情请“:help cscopequickfix”;

<!--[if !supportLists]-->-          <!--[endif]-->如果你想VIM同时搜索tag文件以及cscope数据库,设置cscopetag选项;

<!--[if !supportLists]-->-          <!--[endif]-->cscopetagorder选项决定是先查找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

在大项目中使用cscopehttp://cscope.sourceforge.net/large_projects.html
 

VIM的网站上有很多与cscope相关的插件,有兴趣可以去看一下。这里是搜索结果:

我以前写的一篇关于VIM/ctag/cscope的文章:

http://blog.csdn.net/easwy/archive/2006/08/31/1150909.aspx

 

[参考文档]

<!--[if !supportLists]-->1.       <!--[endif]-->VIM帮助文件

<!--[if !supportLists]-->2.       <!--[endif]-->http://vimcdoc.sourceforge.net/

<!--[if !supportLists]-->3.       <!--[endif]-->http://cscope.sourceforge.net/

<!--[if !supportLists]-->4.       <!--[endif]-->http://iamphet.nm.ru/cscope/

<!--[if !supportLists]-->5.       <!--[endif]-->cscope手册

 

[尾记]

本文可以自由应用于非商业用途。转载请注明出处。

原文链接:http://blog.csdn.net/easwy

 

[版本]

03Apr07, easwy, v0.1, initial version

编辑 webmaster

 
 
 
评论
 
cscope-win32 http://sourceforge.net/project/showfiles.php?group_id=196604&package_id=232374
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •  
    中国源码网 - www.YuanMa.org - 中国 开放源代码+编程 社区