分类: 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 很简单,常用的功能都能在菜单栏找到(然后再记住相应的快捷 键)。
你的系统中必须装有 Cscope ,并且 Emacs 能够找到它,即必须把 cscope 加入到
PATH
中。
把 xcscope.el 放到 emacs 的 load-path 下,然后在 .emacs 中加入下面的语句 即可:
(require 'xcscope)
默认情况下, 好像 Emacs每次调用 Cscope 时都会检查是否有文件被改动过。如果 有的话,就会自动重新编译 cscope 数据库 (cscope.out)。这个功能相当实用。
但是如果工程十分庞大,即使是判断文件更新与否也很费时,可以告诉 Emacs 别自 动更新 cscope.out:
(setq cscope-do-not-update-database t)
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)$' | \
应该是这样的吧 :),我从来没做过这一步。Emacs 默认会从当前目录往上找,遇到 第一个 cscope.files 停止。
打开 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
。
*cscope*
buffer 中:'?' ——显示最常用的几个键
源文件 buffer 中:'C-c s b' 和 'C-c s u'。作用?自己试试就知道了。
xcscope.el 没有保存搜索历史的功能。在看大项目的代码时,不太方便。一方面 是因为搜索一次可能要花几秒、十几秒的时间;另一方面,记性不好的,例如我, 容易忘了查了哪些函数。所以我修改了 xcscope.el ,加上了在搜索历史中前进 后退的功能。
另外,有时候虽然查询的结果很多,但我们只关心其中的一部分。所以我给它加
上了过滤结果的功能。其实就是调用 keep-lines
和 flush-lines
。做的比较粗
糙,能凑合着用而已 :) 。
这两个 patch 我都提交到 sourceforge 上去了
(
)。基准版
本是 cscope15.6 所带的 xcscope.el
。