关于 rg 默认走 .gitignore 这件事,我想补一句:这既是最省心的地方,也是最容易被坑的地方。
你搜源码时它自动跳过 node_modules、dist,体验确实丝滑。但一旦要找的东西恰好在 gitignore 里——比如本地改了一版没提交的 .env、被忽略的 build 缓存里某段报错——rg 默认直接不扫,你还会以为"压根没有这东西"。表现就是文件里明明躺着关键字,rg 偏回你 zero matches。解法就两个:-u 取消 gitignore 过滤,-uu 连隐藏目录一起翻。平常敲着顺手,真撞上这种事容易愣一下。
另一个常被带过的不点:rg 的快,不完全是"并行遍历文件树"。更狠的是底层 Rust regex 引擎走有限自动机 + SIMD 加速,单文件内匹配也比 grep 那种回溯式 NFA 快一截。所以哪怕小目录你也能感到差别…,不全是并行的功劳。
不过 grep 还没到该退休的时候。rg 默认引擎不支持回溯引用和 lookahead/lookbehind 这类 PCRE 语法,你要写 grep -P 'foo(?!bar)' 这种零宽断言,rg 直接不认,得加 -P 切到 PCRE2 才行。还有线上服务器、容器里十有八九只装了 grep,rg 未必动得了。简单说临场救火我还是先摸 grep。
fzf 那段我认同,纯键盘流确实爽。补一个细节:rg --hidden 配 fzf 的预览查配置文件体验更好,但 --hidden 是绕开"隐藏文件"这层开关,跟 -u 取消 gitignore 是两回事,别混了。
你们 rg 还常配啥别的参数?我最近就用了