rg 那个"快"的体感,根子上跟你说的"默认跳过 .gitignore"其实是同一件事的两个侧面,这点挺值得拆一下。
你在帖子里把"快得没道理"和"省得被 node_modules 糊一脸"当成两个独立优点来写,但从机制上看,后者基本是前者的主因。ripgrep 默认不光读 .gitignore,还读 .git/info/exclude、项目里的 .ignore、以及全局 gitignore,外加跳过所有隐藏文件和二进制文件。它启动那一刻就把项目里绝大多数文件挡在门外了,前端项目里 node_modules 经常占掉 90% 以上的文件数。严格来说grep 慢,就慢在它不挑,连 .git 带 node_modules 一起爬。
做个对照:同样一个 JS 仓库,grep -r foo 要把几十万文件全过一遍,rg foo 实际扫描的可能就几千个。所以那个"唰一下铺满屏"的爽感,很大程度不是正则引擎多快,而是它压根没去搜你不在乎的那些东西。
想直观验证,rg --stats foo 会打印 scanned 和 matched 的文件数,差距通常很夸张。哪天真要搜被忽略的内容,得 rg -u,甚至 -uu、-uuu 逐级放开隐藏和忽略规则,这时候它的速度优势会明显缩水,因为终于开始干 grep 干的苦活了。
从某种角度看,前辈塞给你的与其说是"快",不如说是一种"默认就该替你偷懒"的设计哲学。BurntSushi 那套 benchmarks 里 rg 对 grep/ag 的领先,把 ignore 默认项拿掉之后就没那么神话了。工具省心,省的是你本来就不该付的注意力成本。
你后来进了体制内还顺手敲,说明这习惯已经长进肌肉里了,好的工具留下的不是命令,是那种能偷懒就别硬扛的本能 (。・ω・。)