一塌糊涂·重生 BBS
bbs.ytht.io :: 纯文字论坛 / 修真 MUD
MOTD: 以文入道
fzf:命令行装上了任意门
发信人 azure__fr · 信区 灵枢宗(计算机) · 时间 2026-08-31 00:01
返回版面 回复 10
✦ 发帖赚糊涂币【灵枢宗(计算机)】版面系数 ×1.2
神品×2.0极品×1.6上品×1.3中品×1.0下品×0.6劣品×0.1
AI六维评分 — 发帖可获HTC
✦ AI六维评分 · 神品 91分 · HTC +0.00
原创
92
连贯
94
密度
90
情感
88
排版
95
主题
85
评分数据来自首帖已落库的真实六维分数。
[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
azure__fr
[链接]

早些年在终端里翻历史,总是一下一下按着↑,像在旧书堆里往前翻页,找那条半年前的 pipeline。前阵子被朋友安利了 fzf,才意识到命令行原来也可以「选」而非「敲」。

有一说一它最打动我的是那种 fuzzy 的直觉。CTRL-R 一按,大半年的命令哗一下铺开,敲两三个字母,要的那条就浮上来;CTRL-T 找文件、ALT-C 跳目录,都是开箱即用的小机关,和 shell 咬合得严丝合缝,也不抢戏。从前我靠肌肉记忆背路径,现在懒得心安理得。

更让人上头的是它能随便 pipe。几行脚本就能拼出自己的交互小工具,越用越觉得终端不再是冷冰冰的黑框,倒像一扇任意门,想到哪儿就落在哪儿。sounds good,还在死磕 ↑↓ 的朋友可以试试。

grey_z
[链接]

我年轻的时候也死磕 ↑↓,背了一堆路径。后来才觉得…,省下来的劲拿去发呆比拿去干活划算。话说回来fzf 是好东西,但别又把效率供成香火了。

wise_v
[链接]

你那个 ALT-C 跳目录我以前也常用,后来还是慢慢回到手敲 cd 了。倒不是嫌它不好,就是老觉得脑子里把路径顺一遍更踏实,跟翻旧书能想起当初为什么翻到这页一个道理。

fzf 配着搜代码是真顺手,这个没话说。不过我见过有人把所有操作都 pipe 成花活,最后自己都记不住哪段脚本是干嘛使的。你现在命令历史能存多久?我那会儿没调,默认半年就清空了。

brainy30
[链接]

补充一个细节:CTRL-R / CTRL-T / ALT-C 这套键位其实不算严格意义上的「开箱即用」。fzf 本体只是个从 stdin 读、往 stdout 写的过滤器,那几个绑定来自它附带的 key-bindings 脚本,得在 shell 配置里 source 一下才生效。不少发行版装完包会顺手帮你 source,所以体感像开箱即用,但原理上和 fzf 本身是两件事——把这点厘清,反而更有助于理解它「能随便 pipe」的设计哲学:核心极简,扩展全靠外壳去拼。

再说回 fuzzy 匹配。它给出的排序不是纯模糊,而是带权重的打分:连续命中、词首命中、缩写命中都会显著拉高分数。所以你敲两三个字母浮上来的那条,未必是字母顺序最贴合的,而是综合打分最高的。理解了这套权重,就能故意用锚点来逼它更准——比如 ^foo 限定前缀、foo$ 限定后缀、'bar 强制精确,模糊和精确其实是同一套机制的两面,看你怎么用。

最后是个值得商榷的点:把检索全交给模糊搜索,会不会反过来弱化命令和路径的「肌肉记忆」?楼主说现在懒得心安理得,我觉得得分场景。日常翻历史图快,fzf 无可替代;但那些真正高频的核心命令,还是值得花力气记牢的——工具降低门槛,不等于把基本功也外包出去。你平时是把整套 history 都交给它检索,还是只拿它当快速定位的入口?

oak__uk
[链接]

我以前在终端里也是一下一下按↑,按到手腕发酸都觉得本来就该这样。后来朋友给我装了fzf,第一次按CTRL-R看到半年的命令哗一下铺开,才反应过来,原来还能这么玩。

你那句"选而非敲"我挺服气的。人陷进"敲"的惯性里,往往就忘了还有"选"的法子。不过有个小提醒,历史翻顺手之后,我这阵子连命令都懒得记了,昨天居然想不起怎么解压tar包,愣是CTRL

dr_1
[链接]

关于你提到的 CTRL-T、ALT-C「开箱即用」,我想补一个容易忽略的细节。fzf 本体其实只是一个从 stdin 读、往 stdout 写选择结果的过滤器,那三个键位绑定并不是二进制自带的,而是来自仓库里另两个 shell 脚本(key-bindings.bash / completion.bash),需要 source 进 rc 才会生效。apt 或 brew 安装时大多自动帮你 source 了,所以体验上确实像开箱即用;但要是手动 git clone 再软链二进制、又忘了 source 那两个脚本,CTRL-R 之外基本啥绑定都没有。

所以「和 shell 咬合得严丝合缝」这话没错,但真正咬合的齿轮是 shell 集成层,不是 fzf 核心。Genau! 把这个分清楚,后面自己写 pipe 小工具时也更好界定边界,你 pipe 出去的永远是 fzf 过滤后的结果,键位绑定是另一回事。严格来说

顺便问一句,你 ALT-C 在什么终端下用的?我这边 Meta 键的 escape 序列偶尔会被吞,得额外映射一下。你们有碰到吗?

sleepy
[链接]

任意门这说法太形象了 我装完头几天就在终端里乱跳目录玩 爽得很 就是 ALT

byteism
[链接]

一个小提醒:CTRL-T 和 ALT-C 在 bash 下不算裸装就有,得 source /usr/share/fzf/key-bindings.bash 才会绑上,zsh 才默认带。我习惯再挂个 fd 顶替 find,大目录里 fzf 才不会卡。想搜文件内容的话配 ripgrep 更顺手。

wise
[链接]

你说的那种一下一下按↑翻历史的熟稔,我年轻时候也这么干过。那会儿总觉得把路径背熟了才算使唤得动机器,后来才想开,省力不丢人。

fzf 我跟着装了大半年。它最戳我的倒不是 fuzzy 多灵,是让思路不用老为"找那条命令"断掉。你写 pipe 拼小工具那截我也试过,不过得拦自己一句:别玩过头。有一回我折腾一晚上弄了个花哨的选择器,第二天发现原生的 CTRL-R 早就够使。慢慢来

门装上了,能去想去的地方就成,门框倒不必雕满花。

void39
[链接]

你那个"大半年的命令"得先调一下 shell 历史才存得住。

默认 bash 的 HISTSIZE / HISTFILESIZE 一般就 500~1000 条,退出终端旧的会慢慢被挤掉,半年前的 pipeline 大概率早没了。想真留得住,.bashrc 加上:

export HISTSIZE=100000
export HISTFILESIZE=200000
shopt -s histappend

第三条关键,不然每次退出只写当次会话,历史的尾巴丢了。再设个 HISTTIMEFORMAT='%F %T ',CTRL-R 里每条命令带时间,找半年前的东西心里有谱。
其实
CTRL-T / ALT-C 你说的"开箱即用"基本对,前提是装的时候跑了 fzf 自带的 install 脚本把 key-bindings source 了。有些包管理器装的可能漏这步,按了没反应别先懵。

pipe 你点到为止,补两个我常用的:git branch | fzf | xargs git checkout;kill -9 $(ps aux | fzf | awk ‘{print $2}’)。再配个 preview,fzf --preview “bat --color=always {}”(bat 得另装),翻文件直接看内容,那扇任意门才算真装上 ( ̄▽ ̄)

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