是否可以让 Cscope 一次返回多个C符号的搜索结果?
我有一个包含大量header(.h)
和.c
文件的庞大项目,我希望在我的项目中找到foo()
和bar()
(可能更多)的所有实例马上。
目前,当我执行cscope -d
时,我可以一次搜索一个C符号,但我该如何执行以下操作:
Find this C symbol: foo || bar
。 (这不起作用)
因此,简而言之,我希望Cscope搜索能够作为逻辑OR 工作。如何实现这一目标?
答案 0 :(得分:1)
来自Cscope(15.7a)的帮助信息部分地说:
反复按RETURN键移动到所需的输入字段,键入 要搜索的模式,然后按RETURN键。对于前4和 最后2个输入字段,模式可以是regcomp(3)正则表达式。 如果搜索成功,您可以使用这些单字符命令:
和引用的输入字段是:
找到这个C符号:
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:
正则表达式匹配不适用于两个文本字符串操作或egrep
模式。但是,帮助并没有明确表示它使用扩展的正则表达式,尽管研究源代码表明它确实如此。
在SourceForge的Cscope项目中,我从2015年4月开始有Cscope 15.8b的来源。目录cscope-15.8b/src
中的文件是find.c
。在find.c
,在第712ff行,有代码:
712 /* see if the pattern is a regular expression */
713 if (strpbrk(pattern, "^.[{*+$") != NULL) {
714 isregexp = YES;
715 } else {
如果它发现了列出的正则表达式元字符之一,它使用扩展正则表达式模式。问题是,该字符列表不包括|
或(
,两者都是元字符。
当代码更改为:
712 /* see if the pattern is a regular expression */
713 if (strpbrk(pattern, "^.[{*+$|(") != NULL) {
714 isregexp = YES;
715 } else {
并重新编译,然后我可以成功搜索foo|bar
。如果没有更改,cscope
会报告foo|bar
不是有效的C符号 - 这是正确但无用的。
如果您能找到源代码,类似的更改可能会有所帮助。
当我使用Cscope 15.7a时,即使包含列出的一个字符似乎也没有打开扩展正则表达式,但它确实允许简单(基本)正则表达式工作。例如,err_(remark|error)$
包含$
,但不匹配任何内容。使用err.*
确实有用;使用err_[er][er][mo][ar]r.*
无法正常工作。因此,似乎正则表达式支持在Cscope 15.8或其附近主要是新的。
另请参阅SourceForge上的Cscope Issue 294。它交叉引用了这个问题。
答案 1 :(得分:0)
是。使用find this egrep pattern搜索字段(TAB访问)。
e.g:
找到这个egrep模式:(foo | bar)