使用ack
或ag
时是否可以打印出现关键字的函数或类名?这是我很长时间以来一直希望得到的。
我认为这将非常棘手,因为不同的编程语言具有不同的封装函数/类的方式。
请注意,我的目标权利是通过C源代码进行搜索,但是我希望使用涵盖更多语言/语法的通用解决方案。
答案 0 :(得分:2)
正如@Inian所评论的那样,使用ack
,ag
和grep
很难获得可靠的解决方案,因为他们不了解这些语言的语法。
但是,对于查看C源代码文件的情况,我使用带有ack
条件的OR
来包含以函数定义开头的行。就我而言,我所有的函数要么返回int
,要么什么都不返回。因此,以下代码将打印出函数定义行以及包含KEYWORD
的行:
ack 'KEYWORD|^void|^int'
答案 1 :(得分:1)
ack的作者在这里。不,我不知道有什么greplike工具可以理解有关所搜索文本文件的任何信息。人们一直都在要求它,但是我什至从未考虑过实现它。
您说:“我认为这将非常棘手,因为不同的编程语言具有不同的封装函数/类的方式。”你说的没错另外,考虑诸如评论之类的东西
/ * void foo()* /
和文字字符串
printf(“ void foo()”);
这将对任何搜索工具造成问题。字符串void foo()
的两个实例实际上都不是函数声明。
在beyondgrep.com上查看More Tools页面。 cscope之类的内容可能会对您有所帮助。
答案 2 :(得分:1)
尽管您列出的程序当前都没有此功能,但是Git使用基于语言的正则表达式来实现git grep -L
(在函数名称中搜索)。 This blog post描述了它是如何工作的。当前的正则表达式列表位于git源代码树here中,可以按照上面的博客中的描述进行扩展。
此外,ctags提供了一种从多种语言的文件枚举标签的通用方法,但是我(尚未)还找到一种将输出与git grep -L
集成的方法。