【问题标题】:cscope: How to use cscope to search for a symbol using command line?cscope:如何使用 cscope 通过命令行搜索符号?
【发布时间】:2013-02-16 22:47:56
【问题描述】:

我在网上找到的所有 cscope 教程都讲了如何使用 cscope 的交互模式在 vim 和 emacs 等编辑器中搜索符号。但我认为应该可以在终端中发出命令来执行类似

的操作
cscope -d -some_options <my symbol>

而且我应该能够在标准输出中看到结果列表,而不必进入 ncurse UI 并在那里执行所有操作。我认为这是可能的,因为“唯一的”前端 cbrowser 可以在其 TclTK UI 中执行类似的操作。但不幸的是,代码超出了我的范围。

但是,我没有找到有关此功能的文档。

我是在做梦还是有没有记录的方法可以做到这一点?

谢谢!

更新

一些进展:如果我制作一个包含几个具有子目录结构的文件的小项目。然后 rici 的答案开箱即用。具有更大的项目(具有复杂文件夹结构的数千个文件)。即使 cscope.out 和 cscope.files 存在于项目文件夹的根目录(也是我当前的工作目录),我从相同的命令和相同的符号中什么也得不到。我怀疑该命令存在可伸缩性问题。我也试过命令

cat cscope.files | xargs cscope -d -L1 <symbol> -i

无济于事。

更新

非常奇怪!我尝试使用其他一些符号。原来,我正在搜索的特定符号无法使用命令行显示。但我尝试过的所有其他符号都有效。并且 cbrowser 可以毫无问题地找到那个“失败”的符号。不管怎样,我只是运气不好。我将在命令行中询问有关此异常的单独问题。

我将 rici 的答案标记为正确。

【问题讨论】:

  • 我用grepgrep -options &lt;my_symbol&gt; *.c
  • 但那是纯文本搜索。 cscope 更精确。
  • 对,但有时你不需要大炮就能杀死一只苍蝇。
  • 您是否提出了单独的问题?如果是的话,你能链接它吗?
  • 不,我没有。抱歉已经很久很久了。我已经不记得细节了。我的错!但我觉得你的回答很有道理。我将其标记为正确,稍后将对其进行测试。

标签: c++ c vim emacs cscope


【解决方案1】:

您可能正在寻找这个:

cscope -L1<symbol>

您也可以使用-d,但如果您正在修改文件,cscope 最好更新它的数据库。

-L 的意思是“执行一个面向行的命令”,后面的数字(在这种情况下是1),也可以写成一个单独的选项,是特定的命令,手册页混淆了它称为“场”。 “字段”由交互式 cscope 提示给出;为方便起见,我添加了数字。 “this”是指数字后面的文本;请记住,这是一种模式,因此您不必输入完整的符号。

 0 Find this C symbol:
 1 Find this function definition:
 2 Find functions called by this function:
 3 Find functions calling this function:
 4 Find this text string:
 5 Change this text string:
 6 Find this egrep pattern:
 7 Find this file:
 8 Find files #including this file:

【讨论】:

  • 我在我的 cscope.out 所在的文件夹下尝试了你的行“cscope -d -L1 ”。不幸的是,它什么也没给我。另一方面,在同一位置启动“cbrowser”,我可以提交相同的查询并在 UI 中列出结果。我错过了什么吗?我尝试了在选项和符号参数之间有和没有空格的命令行。
  • @kakyo:我只能说它对我有用。您实际上并没有输入&lt;&gt;,对吧?您是否尝试删除 cscope.out 并让 cscope 重建它(即不使用 -d 标志)?
  • 不,我知道符号本身不带有 :)。我刚刚尝试删除 cscope.out,然后是“scope -L1 ”。令我惊讶的是,cscope 并没有即时生成文件。相反,我得到“cscope:找不到源文件”。这是因为我的代码位于相对于 cscope.out 的子文件夹中吗?我必须在该命令中指定源文件吗?
  • @kakyo:是的,如果它们在哪里不明显的话。您可以使用通配符。
  • 确保在 cscope.file 中指定了文件名并且可以正常工作
【解决方案2】:

您可以使用-R 版本调用cscope 进行递归搜索。例如:

cscope -d -f/path/to/cscope.out -R -L1 some_symbol

(搜索 some_symbol 的定义)

cscope -d -f/path/to/cscope.out -R -L3 some_symbol

(显示调用 some_symbol 的所有位置)

如果 cscope.out 位于当前工作目录中,您可以省略 -f 选项。

请注意,如果省略-R,则上述调用对索引符号产生零结果。非常旧的 cscope 版本不支持 -R。例如,15.8a 版本确实支持它。

-L 的可能值列表是:

0: Find this C symbol
1: Find this definition
2: Find functions called by this function
3: Find functions calling this function
4: Find this text string
6: Find this egrep pattern
7: Find this file
8: Find files #including this file
9: Find places where this symbol is assigned a value

-R 选项也可以在创建cscope.out 文件时使用,例如:

cscope -bR

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多