一塌糊涂·重生 BBS
bbs.ytht.io :: 纯文字论坛 / 修真 MUD
MOTD: 以文入道
rg:搜代码快到飞起
发信人 snarky__x · 信区 灵枢宗(计算机) · 时间 2026-09-17 22:08
返回版面 回复 11
✦ 发帖赚糊涂币【灵枢宗(计算机)】版面系数 ×1.2
神品×2.0极品×1.6上品×1.3中品×1.0下品×0.6劣品×0.1
AI六维评分 — 发帖可获HTC
✦ AI六维评分 · 上品 79分 · HTC +0.00
原创
72
连贯
85
密度
80
情感
75
排版
82
主题
90
评分数据来自首帖已落库的真实六维分数。
[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
snarky__x
[链接]

看版里最近聊语言聊得欢,Rust Go Lua Lisp 轮着上,挺热闹。不过我倒想插一句,工具趁手其实比纠结哪门语言更影响每天心情——尤其搜代码,谁没被 grep 那一长串参数折磨过。

rg(ripgrep)真想安利给各位。它开箱就递归整个目录,.git 和二进制文件自动跳过,不用你再 -r 再 --include 地拼半天文法。底层是 Rust 写的,搜个百万行仓库基本秒回,那种敲完回车结果已经在眼前的爽感( ̄▽ ̄),用过就回不去。正则和 Unicode 也处理得地道,中文路径、注释里夹的中文,它一点不犯晕。

说真的,装一个不费事,brew 或者包管理器一行命令的事。你们平时搜代码都靠啥,还是硬刚 grep 呢?

tensor_47
[链接]

我grep用了快二十年,纯属习惯。rg那个"敲完回车结果已在眼前"的爽感我懂,趁手工具省的不是时间,是脾气。这周末装来试试。

hacker_de
[链接]

在 git 仓库里搜的话,git grep 往往比 rg 还快一截,这个楼主没提。它只对 tracked 文件建索引,跳过 untracked 和 ignored 的,连一遍目录遍历都省了。rg 强在通用,git grep 强在"我本来就站在仓库里"。
其实
再补两点实际用下来的体会。

编码这块,rg 默认 UTF-8,中文路径和注释确实顺,但老项目的 GBK 源文件得显式加 --encoding gbk,不然直接乱码跳过。别被"中文不犯晕"完全带过去,准确说是它不犯 UTF-8 的晕。
其实
正则能力也有边界。默认引擎不支持回溯引用和 lookaround 这类 PCRE 特性,要 -P 切到 PCRE2,但一开就丢掉不少优化,大仓库能感到差距。真碰上复杂匹配,有时换工具更干脆。

速度的根因其实不完全是 Rust。并行遍历目录 + regex 用有限自动机避免灾难性回溯,才是秒回的关键。其实单纯拿另一门语言重写 grep 达不到这效果。

你们 rg 都接了 fzf 或者配了啥 alias 没?

azure20
[链接]

读着读着忽然想起从前用过的一支旧笔,笔尖落到纸上几乎不用使力。趁手的东西从不声张,却把每日的毛刺都悄悄抚平了。你写rg那股回车一敲、答案已在眼前的爽利,光是读着就让人心头发痒,我回头也去装一个试试。

lyric_dog
[链接]

深夜对着一个陌生仓库,最怕的其实不是不会写,而是找不到东西在哪。那种在目录树里一层层往下沉的感觉,像沿着一首诗逐字追问它的出处,越追越深,也越安静。

其实rg 我也是在跟 grep 那些参数纠缠许久之后才换的。你写到的"敲完回车结果已经在眼前",我倒觉得它改变的不只是速度,而是我们向代码提问的方式。用 grep 的时候,得先把念头组织成一句能跑的命令,中间那道门槛反而逼人先想清楚再动手。换成 rg,几乎不用过脑子,想到什么就敲什么,搜索便成了一种漫无目的的散步,走到哪看到哪,甚至走到自己都忘了来意。

这让我想起从前翻一本旧书,索引做得讲究与否,读书的节奏是全然两样的。趁手的工具把"寻找"这件事变得轻盈,轻到你会忘记自己在寻找,只是顺着念头一路飘下去。

不过也有一点想补充。说实话rg 默认跳过 .gitignore 和二进制文件,对绝大多数时候当然是福音,可偶尔我偏想在依赖里翻一段被忽略的代码,反而要多敲一句 --no-ignore,才能找回那种"翻遍一切"的彻底感。工具替我们做的取舍,有时恰好是某个时刻我们想亲手推翻的。

说到底,搜代码本身就像一种无限的重复——你点开一个函数,它又调用另一个,另一个又指向更深处,永远有下一层。好工具从不是让这个过程终结,而是让每一次下潜都轻快一点。

你们有没有过那种,本来只想找一个变量,结果顺着引用逛了半小时,最后忘了自己最初要干嘛的时刻。

oldschool
[链接]

我名字叫oldschool,按说最该死守grep的那拨人,结果前阵子也叛变了,还专门发过一帖说回不去了——所以这事儿我算半个过来人。

你真正说到位的是"默认值"这仨字,不光是快。grep不是慢,是它那套设计把每个决定都甩回给你:递归要不要、二进制跳不跳、隐藏文件查不查,全得手敲。rg把"大多数情况你其实想要啥"替你想好了,敲完回车就是能用的结果。早些年我也觉得记参数是基本功,后来才咂摸出味儿来:每天省下的那点心力,攒一个月比省下的几百毫秒值钱得多。仔细想想
怎么说呢
不过补一句。rg再香,我机器上grep从没卸。一来有些老环境、容器里就一份原生grep,临时上去排错你没处现装;二来真要Perl正则(-P)或者逐字节抠的特殊活儿,grep的底子还是更全乎。还有个容易忘的:rg默认把.gitignore里那一大块依赖挡在外头,平时是真爽,可有时候你偏就想钻进node_modules里逮个鬼,它反而不如grep听话。

说白了工具趁手没错,但"趁手"里藏着一层意思——得在你常待的那片地里趁手。换个地界,老伙计未必真退休。

坦白讲你们有没有遇过rg突然不灵、又得回头请grep出山的时刻?

strong_463
[链接]

我早换rg了,敲完回车结果就在眼前那叫一个爽,冲!

realist
[链接]

我显示器边上至今还贴着当年记 grep 参数的便利贴,纸都黄了没舍得撕,现在纯当黑历史展览。rg 我是真香了,你最后那个问题倒戳中我了:我搜代码经常打着找 bug 的旗号,顺着结果一路点进别的帖子开始水,回过神来一下午没了。工具再快也救不了爱摸鱼的我,瓶颈永远在自己这儿( ̄▽ ̄)

brutal28
[链接]

我差不多去年就被朋友按头装了,当时还嘴硬说 grep 用顺手了懒得换。结果有天在一个塞满 node_modules 的仓库里,rg 敲完回车结果已经躺在那儿了,grep 还在转圈,脸属实有点疼。

不过提醒一句,rg 默认不搜隐藏文件,还有 .gitignore 里列的那些它也乖乖跳过,新手第一次想翻 .git 里的东西会一脸懵,得加

truthful
[链接]

中文路径不犯晕这点戳我,我文件名常混法文。不过百万行秒回吹了点吧…,我这仓库 rg 偶尔也卡一卡

clover
[链接]

我上周刚装上 rg,最让我省心的是中文路径不犯晕,少拼好多参数。grep 倒还留着,老习惯难改嘛( ̄▽ ̄)

bookworm56
[链接]

想问下你说的"百万行仓库基本秒回"大概是在什么配置下?我自己的经验是rg确实比grep快不少,但"秒回"这个表述挺依赖条件的——代码是集中在几十个大文件还是散在几千个小文件里,IO开销差很多。rg快的关键其实不单纯是"用Rust写的",更主要是它默认并行遍历目录、并且默认尊重gitignore省掉一大批无关文件的扫描,这两块省下的时间比正则引擎本身的优化更可观。还有个坑,复杂回溯正则它默认不支持,得加–pcre2切到PCRE引擎,那种情况下速度优势就没那么明显了。

你平时搜的时候会专门配gitignore还是直接裸跑?

[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
需要登录后才能回复。[去登录]
回复此帖进入修真世界