假设我们有一个由 100 个文件组成的项目(例如一个库),每个文件包含大约 1000 行代码。你想找到函数 awesome_foo(...) 你是怎么做的?老实说,我发现 grepping 它令人毛骨悚然且无效...
编辑:我主要寻找函数定义
grep -irnw "awesome_foo" *
肯定会给你结果。
参数是:
-i,--忽略大小写
忽略 PATTERN 和输入文件中的大小写区别。
-n,--行号
用输入文件中的行号为每行输出添加前缀。
-R,-r,--递归
递归读取每个目录下的所有文件;这等效于 -d 递归选项。
-w, --word-正则表达式
仅选择那些包含构成整个单词的匹配项的行。测试是匹配的子字符串必须在行首,或者前面有一个非单词组成字符。同样,它必须位于行尾或后跟非单词组成字符。构成单词的字符是字母、数字和下划线。
如果您可以使用诸如notepadd++之类的工具,该工具在文件中具有很好的查找功能,该工具将返回直接文本搜索甚至正则表达式的所有实例。我经常使用它,它非常有帮助。
集成开发环境解析您的代码并生成一个索引,允许您通过 ctrl+单击或使用某些键盘快捷键导航到每个符号的声明(或用法)。这就是人们经常在大型代码库上工作的方式。
如果您不使用 IDE,您仍然有一些选择。
CTags是一个索引器,它读取源文件并生成包含程序符号信息的“索引文件”。它可以连接到一个编辑器(例如 Vim)或者只是生成一个人类可读的符号引用。
这是ctags -x
示例程序的输出:
DrawGLScene 37 lesson5.c void DrawGLScene()
InitGL 15 lesson5.c void InitGL(int Width, int Height) // We call this right after our OpenGL window is created.
ReSizeGLScene 24 lesson5.c void ReSizeGLScene(int Width, int Height)
keyPressed 62 lesson5.c void keyPressed(unsigned char key, int x, int y)
main 78 lesson5.c int main(int argc, char **argv)
它看起来像“名称、行和文件、签名”,可以很容易地手动用作索引。
-x
将表格的、人类可读的交叉引用 (xref) 文件打印到标准输出,而不是生成标记文件。输出中包含的信息包括:标签名称;标签的种类;定义标签的文件的行号、文件名和源代码行(压缩了额外的空格)。不写入标签文件,所有影响标签文件输出的选项都将被忽略。此功能的示例应用程序是生成位于源文件(例如 ctags -x --c-kinds=f 文件)中的所有函数的列表,或生成位于源文件中的所有外部可见全局变量的列表(例如 ctags -x --c-kinds=v --file-scope=no 文件)。此选项必须出现在第一个文件名之前。
使用eclipse
IDE。您可以在导航器中跟踪功能。CodeInsight
也很好。只需添加一个项目来添加跟踪您的代码。相信我,它会节省你的时间。
另一种可能性是astro grep,它是一个 Windows 应用程序,它为您提供一个 gui 来形成您的 grep 语句,消除“刺痛”并使形成复杂搜索的过程非常简单。
“功能: - 正则表达式(使用标准的 Microsoft .Net 正则表达式:快速参考) - 并发多种文件类型 - 递归目录搜索 - 选择搜索表达式上方和下方行的“上下文”功能 - 最近使用的列表搜索路径 - 一些通用的打印选项 - 双击以使用您选择的编辑器打开文件 - 存储最近使用的文件名和搜索表达式 - 仅匹配整个单词 - 语法突出显示 - 免费和开源”