如何使用 cscope 一次搜索多个 C 符号
How to use cscope to search for multiple C symbols at once
是否可以Cscope return 一次搜索多个 C 符号的结果?
我有一个包含一堆 header(.h)
和 .c
文件的大型项目,我想在其中找到 foo()
和 bar()
(也许更多)的所有实例我的项目。
目前,当我执行 cscope -d
时,我可以一次搜索一个 C 符号,但我该如何执行以下操作:
Find this C symbol: foo || bar
。 (这不起作用)
所以,简而言之,我希望 Cscope 搜索能够作为 逻辑 OR 工作。如何实现?
是的。使用查找此 egrep 模式搜索字段(TAB 访问)。
例如:
找到这个 egrep 模式:(foo|bar)
来自 Cscope (15.7a) 的帮助消息部分说:
Press the RETURN key repeatedly to move to the desired input field, type the
pattern to search for, and then press the RETURN key. For the first 4 and
last 2 input fields, the pattern can be a regcomp(3) regular expression.
If the search is successful, you can use these single-character commands:
引用的输入字段是:
找到这个 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.*
不起作用。所以,似乎 regex-support 在 Cscope 15.8 或附近是新的。
另请参阅 SourceForge 上的 Cscope Issue 294。 cross-references这个问题。
是否可以Cscope return 一次搜索多个 C 符号的结果?
我有一个包含一堆 header(.h)
和 .c
文件的大型项目,我想在其中找到 foo()
和 bar()
(也许更多)的所有实例我的项目。
目前,当我执行 cscope -d
时,我可以一次搜索一个 C 符号,但我该如何执行以下操作:
Find this C symbol: foo || bar
。 (这不起作用)
所以,简而言之,我希望 Cscope 搜索能够作为 逻辑 OR 工作。如何实现?
是的。使用查找此 egrep 模式搜索字段(TAB 访问)。
例如:
找到这个 egrep 模式:(foo|bar)
来自 Cscope (15.7a) 的帮助消息部分说:
Press the RETURN key repeatedly to move to the desired input field, type the pattern to search for, and then press the RETURN key. For the first 4 and last 2 input fields, the pattern can be a regcomp(3) regular expression. If the search is successful, you can use these single-character commands:
引用的输入字段是:
找到这个 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.*
不起作用。所以,似乎 regex-support 在 Cscope 15.8 或附近是新的。
另请参阅 SourceForge 上的 Cscope Issue 294。 cross-references这个问题。