OpenSolaris-Land 中的 Cscope-fast
虽然 Chandan 已经编写了一个绝对令人难以置信的 源浏览器,但您有时可能无法访问网络(比如说,此时我正坐在从悉尼开往戈斯福德的火车上写这篇文章),或者可能更喜欢基于文本的浏览器。
大约在一年以前,我在 PTS 上向我们本地的团队展示了如何使用 cscope-fast。
这篇文章将会对上次的展示进行轻微地修改。删除其中与 open solaris 社区无关的材料并添加一些与之相关的材料。例如,您不需要知道我们将源树保存在 Sun 内部的何处,并且您可能对于如何构建 cscope-fast 所使用的倒置索引更感兴趣。
在这篇文章中,我会始终围绕 cscope 进行讨论。 实际上,我的意思就是 cscope-fast。Cscope-fast 是 cscope 的修订版本,它使用更大更快的索引。
下面就是我要讨论的内容:
- 为什么选择 cscope
- 什么是 cscope
- 如何构建索引
- 如何获得 cscope
- 索引子树
- 使用 cscope
- 有用的选项
- 更多信息
为什么选择 Cscope
Chandan 编写的浏览器为基本源树功能提供了一个强大的界面。但是也存在其自身的局限性。
最大的局限是必须在联机的状态下才能使用它。
另外,通过它只能察看联机树。一旦修改了编码,那么它的用处就很小了。
我向来不热衷于使用 GUIs 和基于界面的 Web。虽然它们也有其自身的优点。而 Cscope 可以为我提供基于界面的文本。
另一个特色功能是可以 自己选择 浏览编辑器的编码。这不受浏览器功能的限制。
什么是 Cscope
这是运行中的 cscope 的屏幕截图。
最上一行显示的是最新搜索。
下面是该搜索的匹配清单。
屏幕的底部是可执行的搜索。
其中一些是非常有用的。
我在使用
- Find Assignments to:, 和
- Functions calling this function:
如何构建索引
此处,有两种选择。
- 在源树上构建所有已定义的索引。
- 构建您感兴趣的索引。
/opt/onbld/bin/build_cscope 将消失并在 $SRC/tools/scripts/build_cscope.conf 构建已定义的索引。在默认情况下,这表示我们可以在以下各项中获取索引
- usr/src
- usr/src/uts
- usr/src/uts/sun4u
- usr/src/uts/sun4v
- usr/src/uts/i86pc
- usr/src/psm/stand
- usr/src/psm/stand/boot
- usr/src/psm/stand/boot/sparcv9/sun4u
- usr/src/psm/stand/boot/sparcv9/sun4v
这还会创建 ctag 和 etag 交叉引用。
或者,通过以上任何指定目录发起命令
make cscope.out
将会为所选择的目录创建带 ctags 和 etags 交叉引用的 cscope 索引。
如何获得 cscope
cscope-fast 可以通过 /opt/onbld/bin/`uname -p`/cscope-fast 获得。如果对源代码感兴趣,可以通过 $SRC/tools/cscope-fast
获得。索引子树
先前提到,我们可以在不同的子树上创建 cscope 索引。当只用一个特别的子树工作时,通过运行 cscope 删除您不感兴趣的东西,这种功能的意义就体现出来了。同时,它还极大地提升 egrep 搜索速度。
使用 cscope
在索引目录中发起命令
cscope-fast -dq
-dq 也许是您要运行的最小参数,稍后,我会提到一些其他的选择和它们的实质。
可以通过标记键或上下箭头键导航检索字段。当到达所要搜索类型时,键入关键字并敲回车即可。
情形如下
可以看出,这和我刚才用过的图像是一样的。
在本搜索中,我们寻找到 pidlock 的分配。这也许不是一个很好的用例,因为 pidlock 从一个参数分配到 mutex_enter(),但是它确实显示出本搜索包含一个变量声明。
通常情况,如果只有一项匹配的话,您会直接到达编辑器界面。在本实例中,由于我使用了阻止的选项,所以并没有出现这种情况。稍后会有更多关于这个问题的讨论。
要显示这些匹配,可以通过在所需匹配的左边键入数字进行选择。
再次说明,如果只使用 -dq 作为选项,由于所显示的条目总是小于 10 个,所以不必跟随数字敲击回车。如果使用显示大于 10 个的选项,显然,需要按照选择敲击回车。
我本应该在前面提及的是 $EDITOR 环境变量。如果不对其定义,似乎会默认到 dtpad。至少在运行 CDE 时是这样。虽然 JDS 可以解决这个问题,但是明确一下毕竟不是坏事(对我来说指的是 vi)。
大多数情况,我们会获得超过一页的搜索匹配。这时,可以通过 Plus 和 Minus (+/-) 导航这些页面。使用空格键在它们间向前移动。
通过搜索历史纪录功能,可以迅速地返回到搜索页面搜索其他内容然后再利用历史纪录回到原来的位置。使用Control-B(Back)和 Control-F(Forward)执行历史纪录。
当然,键入一个问号也可以获得帮助页面。
正如我前面已经说明的,使用 vi 的优点之一是:我们创建了 ctags(我不使用 emacs,我把 etags 假设成 emacs,但是我不必知道如何使用它们)。
这意味着当查看一个文件时,可以键入
:ta name要查看 name 的定义,Name 可以是变量、函数或者类。
要返回到正编辑的文件,敲击 Control-T 弹出标记堆栈。
Tag 命令可以通过键入下面内容重复
:ta
有用的选项
对 cscope-fast 指定相同的选项,一段时间后,会产生疲倦。此外,如果使用次数不多,则没有必要离开页面然后再次回来找到您想要的选项。由于某些原因导致的手册页不可用在此也毫无帮助。
在启动时进行保存不失是一个好主意。可以在 $CSCOPEOPTIONS 里执行。
下面是一些我喜欢使用的选项:CSCOPEOPTIONS=-dqrp5。
- 'd' - 预构建索引
- 'q' - 快速(倒置)索引
- 'r' - 尽可能展示适合屏幕的行
- 'p' - 显示目录元素数量
更多信息
如果安装了 vim,可以利用它提供的 cscope 模式在编辑器内部执行 cscope 操作(标记命令除外)。这增加了一些有用的功能,比如当光标位于您感兴趣的函数或变量名顶端时,可以通过简单的按键打开多重文件以及跳到某个定义。
对 vim 的讨论超出了本文的范围,并且实际上,我之前也没有经常使用它。如果您想要对它有更多的了解,可以在 google 中搜索关键字 “vim” 和 “cscope” 了解更多信息。
本文翻译自:http://blogs.sun.com/tpenta/entry/cscope_fast_in_opensolaris_land
发表于 jerry [JDS] ( 四月 30, 2008 12:16 上午 ) Permalink | 评论[0]
