熟悉一个新的项目、新的 Code Base 总是非常痛苦,最痛苦的事情莫过于阅读 Code Base 时编辑器或者 IDE 不好用,各个方法总是看不到定义。这里总结一下我使用的代码阅读工具。
IDE / Language Service
如果 Code Base 及其依赖可以被 IDE 识别、组里流行使用 IDE, 那是再好不过了。基本上只有 Java/Scala 语言有这个待遇,Intellij IDEA 一般能正确加载这些项目。Golang 使用 Intellij 工具或者 VSCode 一般也是可以的。
如果项目没有很好的 IDE 支持,或者 Java 项目却没有 Intellij 可用,我的经验是趁早放弃 IDE, 以及包括 VSCode 在内的任何编辑器的 Language Service. 缺乏语言级别的 IDE 支持、通用的依赖管理方案,则调试 IDE 就要花大量时间,而且每次换项目、换环境,都需要重新调试,最后也不一定能搞定。
Ctags
这是一个古早的方案,Ctags 是一个命令行工具,基本原理是扫描整个 Code Base 生成所有符号定义的索引,该索引可以被 Vim 等工具使用从而快速查找符号定义。
这里不采用这个方案,原因在于建立索引比较慢,而且 Ctags + Vim 这一套学习成本较高。Ctags 这个工具使用范围也比较有限,并且已经没有良好的维护了。
正则表达式搜索
正则表达式搜索定义比较笨拙,但并不是特别麻烦,并且对多数语言可行。该方法只能搜索源文件,不能搜索 Java 的二进制依赖等。适用于组织内部的代码库,不太适用于外部依赖。
VSCode
- 将所有可能包含目标代码的文件夹加入 Workspace
- 使用
Command+Shift+F
启动全局搜索,点击搜索框下方的省略号打开文件类型选项,只搜索目标语言的源文件 - 搜索关键词,如果 Match 过多,可以设法构造一个容易搜索到定义的正则表达式
- 函数定义如
void functionName
- 类/结构定义如
struct StructName
- 模板函数或者类定义如
functionName[^<]
- 函数定义如
RipGrep / Grep
这是一个增强版的 Grep, 速度更快,使用更方便。命令为 rg
. 这是一个非常强大的搜索工具,也可以用来搜索日志等文本。
这个软件需要单独安装,恰好 conda 含有这个软件包(conda 除了 Python 也可以用来安装别的一些稀奇古怪的东西),
conda install -c conda-forge ripgrep
# -g 只搜索文件名匹配特定 pattern 的文件
rg -g '*.h' 'functionName[^<]' .
如果没有 RipGrep 可用,可以使用 Grep 替代,稍微慢一点,
# -R 递归搜索
# -E 正则表达式
# --include 只搜索文件名匹配特定 Pattern 的文件
grep -RE --include '*.h' 'functionName[^<]' .
顺便一提,如果需要查找特定文件名,
find . -name 'hello_world.*'