是否可以打印使用ack
or时出现关键字的函数或类名ag
?这是我很长一段时间以来一直非常渴望的东西。
我认为这会很棘手,因为不同的编程语言有不同的封装函数/类的方式。
请注意,我的目标是搜索 C 源代码,但是我更喜欢涵盖更多语言/语法的通用解决方案。
正如@Inian 评论的那样,使用 很难获得强大的解决方案ack
,因为他们不了解语言的语法。ag
grep
但是,对于我查看 C 源代码文件的情况,我使用ack
了一个OR
条件来包含以函数定义开头的行。就我而言,我所有的功能要么返回,int
要么什么都没有。因此,以下代码打印出函数定义行以及包含以下内容的行KEYWORD
:
ack 'KEYWORD|^void|^int'
尽管您列出的程序目前都没有此功能,但 Git 使用基于语言的正则表达式来实现git grep -L
(在函数名称中搜索)。 这篇博客文章描述了它是如何工作的。当前的正则表达式列表位于此处的 git 源代码树中,并且可以按照上面博客中的描述进行扩展。
此外,ctags提供了一种从多种语言的文件中枚举标签的通用方法,但我(还)还没有找到一种方法来集成这个输出git grep -L
。
ack 的作者在这里。不,我不知道有任何 greplike 工具可以理解它正在搜索的文本文件的任何内容。这是人们一直要求的东西,但我从来没有想过要实现它。
你说“我认为这会很棘手,因为不同的编程语言有不同的方法来封装函数/类。” 你完全正确。另外,考虑评论之类的事情
/* 无效的 foo() */
和文字字符串
printf("void foo()");
这会导致任何搜索工具出现问题。字符串的这些实例void foo()
实际上都不是函数声明。