Chinaunix首页 | 论坛 | 博客
  • 博客访问: 407135
  • 博文数量: 128
  • 博客积分: 2247
  • 博客等级: 大尉
  • 技术积分: 767
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-17 09:30
文章分类

全部博文(128)

文章存档

2011年(4)

2010年(124)

我的朋友

分类: LINUX

2010-06-28 16:54:09

Created: Fang lungang(方伦钢) 10/30/2006 Modified: Fang lungang 02/29/2008 08:48>

有几种 Emacs 插件都提供了 Cscope 接口。我试用后最终选择了 xcscope.el 。尽 管它是为XEmacs 开发的,但是它和 GNU Emacs 结合很好。

使用 xcscope.el 很简单,常用的功能都能在菜单栏找到(然后再记住相应的快捷 键)。

0. 准备

你的系统中必须装有 Cscope ,并且 Emacs 能够找到它,即必须把 cscope 加入到 PATH 中。

1. 安装

把 xcscope.el 放到 emacs 的 load-path 下,然后在 .emacs 中加入下面的语句 即可:

(require 'xcscope)

默认情况下, 好像 Emacs每次调用 Cscope 时都会检查是否有文件被改动过。如果 有的话,就会自动重新编译 cscope 数据库 (cscope.out)。这个功能相当实用。

但是如果工程十分庞大,即使是判断文件更新与否也很费时,可以告诉 Emacs 别自 动更新 cscope.out:

(setq cscope-do-not-update-database t)

2 使用

2.1 创建文件列表

cscope 要根据文件列表(cscope.files)来创建数据库(cscope.out)以供以后的 查询使用,所以第一步是创建文件列表。cscope.files 的格式是每行一个文件(包 含与cscope.files 的相对路径)。

比较简单的源码,你可以手工创建 cscope.files ,例如用 find 命令:

find . -name '*.c' -type f > cscope.files

但我推荐用网上的一个 BASH 脚本 “cscope-indexer",调用命令为:

cscope-indexer [-r]

可选参数表示递归检索子目录。

因为是开源的脚本,你还可以根据自己的需要修改 cscope-indexer。例如我现在看 的代码中有许多后缀为 '.x' 的源文件,我就把脚本中下列行稍作修改:

egrep -i '\.([chly](xx|pp)*|cc|hh)$' | \

改成

egrep -i '\.([chly](xx|pp)*|cc|hh|x)$' | \

2.2 为 Emacs 指定 cscope.file 的位置

应该是这样的吧 :),我从来没做过这一步。Emacs 默认会从当前目录往上找,遇到 第一个 cscope.files 停止。

2.3 享用

打开 C/C++ 文件,菜单栏上会多出来一项 cscope,用鼠标在下拉列表中选择就 行了。具体的操作我就不说了,实在是太简单了。如果想用快捷键, xcscope.el 注释中有详细的文档。只想提醒一下,程序文件中cscope 的快捷键 是 cscope buffer 中相应的快捷键加上 'C-c s' ('C-c' 表示是mode 相关,'s' 代表 'scope' or 'search' ?)。例如

*cscope* buffer 中按字母 'n' 看下一个 symbol,在源文件中则需要按 C-c s n

2.3.1 两个特别有用的键

*cscope* buffer 中:'?' ——显示最常用的几个键

源文件 buffer 中:'C-c s b' 和 'C-c s u'。作用?自己试试就知道了。

我的扩展

xcscope.el 没有保存搜索历史的功能。在看大项目的代码时,不太方便。一方面 是因为搜索一次可能要花几秒、十几秒的时间;另一方面,记性不好的,例如我, 容易忘了查了哪些函数。所以我修改了 xcscope.el ,加上了在搜索历史中前进 后退的功能。

另外,有时候虽然查询的结果很多,但我们只关心其中的一部分。所以我给它加 上了过滤结果的功能。其实就是调用 keep-linesflush-lines 。做的比较粗 糙,能凑合着用而已 :) 。

这两个 patch 我都提交到 sourceforge 上去了 ( )。基准版 本是 cscope15.6 所带的 xcscope.el

阅读(1622) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~