fzf 事件驱动实战:3 个可编程技巧,把终端操作省下一半
fzf 事件驱动实战3 个可编程技巧把终端操作省下一半【免费下载链接】fzf:cherry_blossom: A command-line fuzzy finder项目地址: https://gitcode.com/GitHub_Trending/fz/fzf凌晨排查问题你想杀掉一个卡住的进程流程却是这样的敲ps -ef满屏输出里靠肉眼扫 PID再复制再敲kill。换个场景也一样——想看看某个目录下的文件翻完文件又想看目录只能退出重开。这种敲命令—找结果—再敲命令的循环fzf 能打断。它是命令行的模糊查找器能把任何命令的输出变成可交互的过滤列表但真正值钱的是它的事件驱动、可编程机制fzf 运行期间你可以让它重载列表、执行命令、甚至把自己替换成别的程序。本文就围绕这三件事展开。你的终端还在复制粘贴先搞清楚 fzf 的三条事件线说白了--bind就是 fzf 的接线板左边是键盘事件start启动时、change查询变化、enter回车或任意自定义按键右边是动作reload重建列表、execute后台跑命令、become整个进程变身、transform动态生成动作、change-prompt换提示符。一条key:action就是一个事件绑定绑上之后fzf 就从静态列表变成会响应你的程序。仓库里没有合适的事件流示意图就不硬编一张了靠下面的表理解流向即可你想做什么触发键底层动作按一次键刷新列表ctrl-rreload(命令)输入变化就重新搜索changereload(...{q})回车直接进编辑器enterbecome(vim ...)一个键来回切两种视图ctrl-ttransform实战一把 ripgrep 塞进 fzf全文搜索只敲一次先说痛点大仓库里全文搜索grep结果多到没眼看而 fzf 自身的模糊过滤又只发生在内存里那一份列表上对跨几千个文件搜文本这种活心虚。两个工具各管一半缺的是把 rg 初筛结果接进 fzf 做二次精筛的管道回车后还要精确落到命中行。最小可运行写法需要 rg 和 batrg --coloralways --line-number --no-heading --smart-case 关键词 | fzf --ansi \ --delimiter : \ --preview bat --coloralways {1} --highlight-line {2} \ --bind enter:become(vim {1} {2})逐行看rg负责搜出文件:行号:内容--ansi让 fzf 解析 rg 的 ANSI 颜色码--delimiter :按冒号拆列{1}是文件路径、{2}是行号喂给bat预览并高亮命中行enter:become(...)让 fzf 进程直接变身成 vim光标就停在{2}那一行不用退出 fzf 再敲 vim。如果只记住三件事--ansi没有它rg 的高亮会显示成一堆乱码控制符--delimiter :列拆分是整个预览、回车跳转的地基enter:become(...)fzf 结束时不是输出结果而是变成你指定的命令。想要打字即搜索把change事件也绑上reload就行--bind change:reload:sleep 0.1; rg ... {q} || true --disabled{q}是提示框里的实时查询串每敲一个字符 fzf 就重新跑一遍 ripgrepsleep 0.1是防抖砍掉打字中间态拉起的多余进程--disabled让 fzf 放弃自身过滤搜索完全交给 rg大仓库下更快也更省内存。想临时切回纯 fzf 模糊模式按官方给的alt-enter解绑 change 事件即可基于transform的单键完整写法见 ADVANCED.md。实战二一个键换数据源让 fzf 变成活的文件列表翻完想看目录、进程列表过两分钟就过期了——这种时候退出重开太粗暴。reload就是干这个的fzf 运行中执行任意命令并重建候选列表。最小示例(date; ps -ef) | fzf --bindctrl-r:reload(date; ps -ef) \ --header$Press CTRL-R to reload\n\n --header-lines2 \ --layoutreverse --height80%--header加--header-lines2是顺手的小技巧提示语固定在最上面且头两行不允许被光标选中省得误杀date那行。更狠的是单键来回切。这个写法有点反直觉但确实只有一条 bind状态就存在 prompt 字符串里transform每次按键时根据$FZF_PROMPT动态吐出一套动作。fd --type file | fzf --prompt Files \ --bind ctrl-t:transform:[[ ! $FZF_PROMPT ~ Files ]] echo change-prompt(Files )reload(fd --type file) || echo change-prompt(Directories )reload(fd --type directory) \ --preview [[ $FZF_PROMPT ~ Files ]] bat --coloralways {} || tree -C {}按一次 Ctrl-T 进 Directories 模式再按一次弹回 Files 模式预览命令也跟着换。这里transform的妙处在于它输出的不是数据而是下一批要执行的动作。实战三preview 窗口追日志告别另开一个 terminal盯kubectl logs或本地app.log传统姿势是再开一个 tab 跑tail -f然后在两个窗口间来回切。fzf 的解法就一行--preview-window follow。它和tail -f的区别在于fzf 能在 preview 命令还没结束时就把已输出的部分渲染出来——preview 本身可以是长驻命令follow只负责让窗口自动滚到底部。一个完整的 pods 日志工作流保留三个最关键的--bindpods() { fzf --infoinline --layoutreverse --header-lines1 \ --bind start,ctrl-r:reload:kubectl get pods --all-namespaces \ --bind enter:execute:kubectl exec -it --namespace {1} {2} -- bash \ --bind ctrl-o:execute:${EDITOR:-vim} (kubectl logs --namespace {1} {2}) \ --preview-window up:follow \ --preview kubectl logs --follow --all-containers --tail10000 --namespace {1} {2} # 其余 header、布局轮换等绑定省略 }日常操作就三个动作移动光标切 Pod 日志回车直接进容器 shell按 ctrl-o日志丢给编辑器细看。收个尾reload让列表活着transform让一个键承载两种状态follow让预览窗口长成日志跟踪器——这三块积木搭起来fzf 就不再是查找器而是你的终端应用框架。想深入可以看ADVANCED.md本文所有例子的官方完整版man/man1/fzf.1全部选项的细节手册shell/key-bindings.bash现成的按键绑定脚本先在任意列表上随手加一条ctrl-r:reload(...)试试五分钟的事。【免费下载链接】fzf:cherry_blossom: A command-line fuzzy finder项目地址: https://gitcode.com/GitHub_Trending/fz/fzf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考