cscope [options] files...
cscope 是一个面向屏幕的交互式工具,允许用户浏览 C 源文件,从中查找指定的代码元素。
缺省情况下,cscope 会在当前目录中检查 C(.c 和 .h)、lex (.l) 和 yacc (.y) 源文件。对于在命令行中指定的源文件,也可能会调用 cscope。在任何一种情况下,cscope 都会在标准目录中搜索在当前目录中未找到的 #include 文件。缺省情况下,cscope 使用符号交叉引用 cscope.out 在文件中查找函数、函数调用、宏、变量和预处理程序符号。
首次对浏览的程序的源文件使用 cscope 时,它会生成符号交叉引用。在后续调用中,仅当源文件已更改或源文件列表不同时,cscope 才会重新生成交叉引用。重新生成交叉引用时,将从旧交叉引用复制未更改文件的数据,这使得重新生成比初始生成速度要快。
以下选项能以任意组合出现:
仅生成交叉引用。
搜索时不区分字母大小写。
在交叉引用文件中仅使用 ASCII 字符,即不压缩数据。
不更新交叉引用。
禁止文件之间的 ^e 命令提示符。
使用 reffile 作为交叉引用文件名,而非缺省值 cscope.out。
在 incdir 中查找(在标准位置(通常是 /usr/include)中查找头文件之前)名称不是以 / 开头且未在命令行中或以下 namefile 中指定的任何 #include 文件。(#include 文件可能以双引号或尖括号指定。)除当前目录(首先搜索)和标准列表(最后搜索)之外,还会搜索 incdir 目录。如果 -I 出现多次,将以在命令行中出现的顺序搜索目录。
浏览名称在 namefile 中列出的所有源文件(文件名由空格、制表符或换行符分隔)而非缺省值 (cscope.files)。如果指定了此选项,cscope 将忽略命令行中出现的任何文件。
与 -num pattern 选项一起使用时,利用面向行的输出执行单一搜索。
面向行的界面(请参见下文“面向行的界面”)。
转至输入字段 num(从 0 开始计数),并查找 pattern。
在预生成交叉引用文件中的相关文件名前面添加 path,这样便无需更改为已生成交叉引用的目录。此选项只对 -d 选项有效。
显示最后 n 个文件路径组成部分而非缺省值(1 个)。使用 0 将完全不显示文件名。
在 dir 中查找其他源文件。如果在命令行中指定了源文件,则忽略此选项。
仅使用前八个字符与 C 符号进行匹配。如果包含特殊字符而非句点 (.) 的正则表达式的最小长度大于八个字符,则不会匹配任何符号。
不检查文件时间戳(假定未更改任何文件)。
无条件地生成交叉引用文件(假定所有文件都已更改)。
在屏幕上的第一行中输出 cscope 的版本号。
-I、-p 和 -T 选项也可以在 cscope.files 文件中。
交叉引用准备就绪后,cscope 将显示以下菜单:
Find this C symbol: Find this global definition: Find functions called by this function: Find functions calling this function: Find this text string: Change this text string: Find this egrep pattern: Find this file: Find files #including this file:
重复按 TAB 键移至所需输入字段,键入要搜索的文本,然后按 RETURN 键。
如果搜索成功,可使用以下任何单字符命令:
编辑指定行号引用的文件。
显示下一组匹配行。
显示下一组匹配行。
显示上一组匹配行。
按顺序编辑显示的文件。
将显示的行列表附加至某个文件。
将所有行通过管道传送至某个 shell 命令。
在任何时候,也可使用以下单字符命令:
移至下一个输入字段。
移至下一个输入字段。
移至下一个输入字段。
移至上一个输入字段。
使用上次键入的文本进行搜索。
移至上一个输入字段并搜索模式。
移至下一个输入字段并搜索模式。
搜索时在不区分/区分大小写之间切换。(不区分字母大小写时,搜索 FILE 将与 File 和 file 匹配。)
重新生成交叉引用。
启动交互式 shell(键入 ^d 可返回 cscope)。
重画屏幕。
显示关于 cscope 命令的帮助信息。
退出 cscope。
注意:如果要搜索的文本的第一个字符与上述命令之一匹配,要先键入 \(反斜杠)对其进行转义。
键入要更改的文本后,cscope 将提示输入新文本,然后将显示包含旧文本的行。使用以下单字符命令选择要更改的行:
标记要更改的行或去标记。
标记要更改的所有显示行或去标记。
显示下一组行。
显示下一组行。
显示上一组行。
标记要更改的所有行。
更改标记的行并退出。
退出而不更改标记的行。
启动交互式 shell(键入 ^d 可返回 cscope)。
重画屏幕。
显示关于 cscope 命令的帮助信息。
如果您的终端有在 vi (1) 中使用的方向键,您可以使用它们围绕输入字段移动。可使用向上方向键移至上一个输入字段,而不必重复使用 TAB 键。如果您有 CLEAR、NEXT 或 PREV 键,它们分别充当 ^l、+ 和 - 命令。
借助 -l 选项,您可以在面向屏幕的界面派不上用场的情况下(例如从面向屏幕的其他程序)使用 cscope。cscope 准备好接受输入行时,将以 >> 给出提示,开头是字段编号(从 0 开始计数),后面紧跟搜索模式,例如 1main 将查找 main 函数的定义。如果您只需要单一搜索,请使用 -L 和 -num pattern 选项,而不要使用 -l 选项,此时您不会得到 >> 提示。对于 -l,cscope 将输出引用行数。
cscope: 2 lines
对于找到的每个引用,cscope 都会输出一行,其中包括文件名、函数名、行号和行文本(由空格分隔),例如:
main.c main 161 main(argc, argv)
请注意,不会调用编辑器来显示单一引用,这与面向屏幕的界面不同。
您可以使用 r 命令重新生成数据库。当检测到文件结尾或者当输入行的第一个字符是 ^d 或 q 时,cscope 会退出。
首选编辑器,缺省值为 vi(1)。
要从中搜索 #include 文件的目录的冒号分隔列表。
起始目录,在登录时自动设置。
首选 shell,缺省值为 sh(1)。
要从中搜索其他源文件的目录的冒号分隔列表。
终端类型,必须是屏幕终端。
终端信息目录全路径名。如果终端不在标准 terminfo 目录中,请参见 curses(3CURSES) 和 terminfo(4),了解如何编写自己的终端描述。
临时文件目录,缺省值为 /var/tmp。
首选文件显示程序 [例如 pg],它将覆盖 EDITOR(请参见上文)。
冒号分隔的目录列表,每个目录下面具有相同的目录结构。如果设置了 VPATH,cscope 将在指定目录中搜索源文件;如果未设置,cscope 将只在当前目录中搜索。
包含 -I、-p 和 -T 选项以及源文件列表的缺省文件(由 -i 选项覆盖)。
符号交叉引用文件,如果无法在当前目录中创建,会将其放在起始目录中。
在替换旧交叉引用之前包含新交叉引用的临时文件。
《C 用户指南》。
cscope 可识别以下格式的函数定义:
fname blank ( args ) white arg_decs white {
其中:
是函数名称
是零个或多个空格或制表符,不包括换行符
是不包含 " 或换行符的任何字符串
是零个或多个空格、制表符或换行符
是零个或多个参数声明(arg_decs 可能包括注释和空格)
函数声明不必从一行开头开始。返回类型可能在函数名称前面;cscope 仍可识别声明。偏离这种格式的函数定义无法由 cscope 识别。
菜单选项 Find functions called by this function: 输入字段的搜索输出的 Function 列将只在行中显示调用的第一个函数,即对于以下函数:
e() { return (f() + g()); }
显示内容是:
Functions called by this function: e File Function Line a.c f 3 return(f() + g());
有时,可能无法识别函数定义或调用,原因是 #if 语句内包含大括号。同样,可能会将变量的使用错误地识别为定义。
会将预处理程序语句前面的 typedef 名称错误地识别为全局定义,例如:
LDFILE * #if AR16WR
预处理程序语句也会阻止识别全局定义,例如:
char flag #ifdef ALLOCATE_STORAGE = -1 #endif ;
会将函数内的函数声明错误地识别为函数调用,例如:
f() { void g(); }
会错误地识别为对 g() 的调用。
cscope 可通过查找类关键字识别 C++ 类,但是无法识别 struct 也是一个类,所以无法识别结构中的内联成员函数定义。它也不认为 typedef 中存在类关键字,所以会将以下语句中的 X 错误地识别为定义:
typedef class X * Y;
它也无法识别运算符函数定义
Bool Feature::operator==(const Feature & other) { ... }