02-别再用cd和grep了!这两个神器让我终端效率直接拉满

养虾日记配套工具:我写OpenClaw自动化脚本、Go开发天天用的终端神器,2分钟装好,拿来就能用 上一篇给大家分享了bat + eza,替代了系统自带的cat和ls,装上之后,想必你的终端体验直接上了一个台阶。 今天继续更新《极客工具库》系列,给大家分享两个我用了多年、每天必敲的终端神器:fzf + rg,直接换掉你天天用的cd和grep。 作为天天和终端打交道的开发者,你肯定遇到过这些痛点: 目录层级太深,cd来回切,输路径输到崩溃 找之前敲过的命令,按上箭头翻半天,翻到眼花也找不到 用grep在项目里搜代码,慢到怀疑人生,还搜不到隐藏文件 找文件全靠ls一个个翻,效率低到离谱 这两个神器,完美解决上面所有问题,每天至少帮我省2小时的无效操作。 保姆级教程安排上,2分钟就能装好,全平台兼容,零代码基础也能跟着做。 一、fzf:终端模糊搜索神器,告别无效cd/翻历史命令 fzf是一款GoLang开发的终端通用模糊搜索工具,号称「终端搜索瑞士军刀」,核心解决「找文件、找目录、找历史命令慢」的痛点,是我打开终端必用的工具。 1. 特性 小巧便携: 作为单一二进制分发,便于安装 极速高效: 支持即时搜索几百万的数据 可扩展: 通过事件-行为绑定机制完全实现自定义 支持各个主流终端: 包含 Bash、Zsh、Fish、Vim 和 Neovim 的集成 2. 一键安装命令 MacOS: 1brew install fzf Windows 1winget install fzf Ubuntu/Debian: 1apt install fzf CentOS/RHEL: 1dnf install fzf 安装完成后,执行这条命令,启用自动补全和快捷键绑定,一劳永逸: 1$(brew --prefix fzf)/install --all 执行完重启终端,就能直接用了。 2. 3个我天天用的核心实战用法 用法1:一秒搜索历史命令,告别疯狂按上箭头 这是我用得最多的功能,没有之一。 在终端里按下Ctrl + R,会直接弹出fzf搜索窗口,输入你记得的命令关键词,会实时模糊匹配所有历史命令,上下箭头选中,回车直接执行。 比如我想找之前敲过的OpenClaw相关命令,只需要输入openclaw,所有相关命令都会列出来,再也不用按上箭头翻半天了。 用法2:一键跳转任意目录,告别反复cd 不用再记复杂的目录路径,不用一级一级cd,配合zoxide(后续会讲),一键跳转到你想去的任何目录。 ...

2026-03-12 · 1 min · 204 words · 老墨

终端党的武器库:这些工具让我效率起飞

大家好,我是极客老墨! 说实话,我已经很久没打开过图形化的 Git 客户端了。 不是装逼,是真的用不着。终端里敲几个快捷键,commit、push、rebase 全搞定,比鼠标点来点去快多了。写代码也一样,Neovim 配合 AI 工具,效率直接起飞。 这些年折腾下来,我的工作流基本都在终端里完成:写代码、审代码、写文章、发 HTTP 请求、跑脚本、运维操作……全都不需要离开黑框框。下面这些工具是老墨亲测好用的,不是什么"推荐清单",是我每天都在用的家伙。 Neovim Neovim 是我的主力编辑器。 现在 VSCode 系的 AI IDE 满天飞,Cursor、Windsurf、Kiro 一个比一个卷。但我写脚本和小项目还是习惯用 Neovim,配合 Claude Code 或者 OpenCode,该有的 AI 能力一个不少,关键是够轻、够快、够纯粹。 学习成本?确实高。自己配置需要懂点 Lua,不过现在有 Lazyvim 这种开箱即用的配置,省了不少事。我平时也会用 Cursor、Kiro、Antigravity 这些 AI IDE 蹭免费额度,但会装 Neovim 插件,把快捷键和配置同步过去——肌肉记忆改不了。 WezTerm WezTerm 是我现在用的终端。 GPU 加速、跨平台、Rust 写的,性能没得说。配置是用 Lua 写的,刚开始确实要折腾一阵子,但配好之后就是你的专属终端了。配合 Neovim 用起来特别顺手,分屏、标签页、字体渲染都能调到自己喜欢的样子。 iTerm2?用过,但 WezTerm 更快,而且配置文件可以直接扔 GitHub 同步,换机器直接拉下来就能用。 Lazygit Lazygit 是我用过最爽的 Git 工具。 TUI 界面,几个快捷键就能完成 commit、push、rebase、cherry-pick,再也不用记那些鬼畜的 Git 命令了。刚开始需要看看文档熟悉一下快捷键,但上手之后就回不去了。 ...

2026-02-22 · 2 min · 319 words · 老墨

[GoLang避坑实战-18] 实战 CLI 工具:30 分钟用 urfave/cli 构建你的极客武器

大家好,我是极客老墨。 上一篇我们写了个小工具——一个简单的命令行计算器,需要从命令行读参数, 我们直接通过 os.Args 来解析命令行参数,这种方式太底层、太原始了,非常容易出错。 说实话,Go 虽然内置了 flag 包,但用起来仍然不是很方便。想要做个像样的 CLI 工具,光靠 flag 远远不够。 今天我们就来聊聊如何用 Go 社区最受欢迎的 urfave/cli 框架,打造真正的极客工具。 为什么不用 flag 包? Go 标准库的 flag 包确实能解析参数,但问题是: 1// 用 flag 包写个简单的工具 2var name = flag.String("name", "", "your name") 3var age = flag.Int("age", 0, "your age") 4 5flag.Parse() 6 7if *name == "" { 8 fmt.Println("name is required") 9 os.Exit(1) 10} 看到没?每个参数都要手动验证,帮助信息要自己拼,子命令?不存在的,得自己实现。 写个小工具还行,但要做个像 git、docker 那样的专业 CLI,光靠 flag 真的会疯。 ...

2025-11-20 · 7 min · 1448 words · 老墨

[GoLang避坑实战-17] 从零撸一个计算器:基础知识的大合练

大家好,我是极客老墨。 学了这么多语法,是时候写个完整项目了。光看代码片段,很难理解 Go 项目是怎么组织的。这篇我们从零开始,写一个命令行工具,看看真实项目的结构和开发流程。 项目目标 我们要做一个简单的命令行计算器,支持基本的数学运算。 功能需求 支持加减乘除运算 命令行参数输入 彩色输出结果 错误处理 技术要点 Go Modules 依赖管理 标准项目结构 包的导入和使用 第三方库集成 交叉编译 初始化项目 第一步是创建项目目录并初始化模块。 创建项目 1cd go-tutorial-code 2# 创建项目目录 3mkdir 15-project-example 4cd 15-project-example 5 6# 初始化 Go Module 7go mod init github.com/gkmz/calc 这里老墨为了教程的需要,把代码放到了 go-tutorial-code, 并且模块名称没有与文件夹名称一致。 生成的 go.mod: 1module github.com/gkmz/calc 2 3go 1.24 要点: 模块名通常是代码仓库地址 go.mod 是项目的起点 初始化后就可以开始写代码了 项目结构 Go 项目有约定俗成的目录结构。 标准布局 115-project-example/ 2├── go.mod # 模块定义 3├── go.sum # 依赖校验 4├── cmd/ # 命令行工具目录 5│ └── calc/ 6│ └── main.go 7├── pkg/ # 可导出的库代码 8│ └── calculator/ 9│ ├── calculator.go 10│ └── calculator_test.go 11├── internal/ # 私有代码(不可被外部导入) 12│ └── utils/ 13│ └── helper.go 14├── README.md # 项目说明 15└── Makefile # 构建脚本(可选) 目录说明: ...

2025-11-10 · 8 min · 1514 words · 老墨

Rust 学习笔记 20:项目实战二:构建 grep 命令行工具 (minigrep)

Rust 学习笔记 20:项目实战二:minigrep “UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity.” – Dennis Ritchie 到目前为止,我们已经学习了 Rust 的大部分核心特性。现在,让我们把它们串起来,复刻一个经典的命令行工具:grep。 我们的目标是创建一个 minigrep,它接受一个查询字符串和一个文件名,然后打印出文件中包含查询字符串的行。 1. 需求分析 用法: 1$ cargo run -- searchstring example-filename.txt 功能点: 读取命令行参数。 读取文件内容。 筛选包含关键词的行。 错误处理(用户没传参数?文件不存在?)。 关注点分离:main.rs 负责处理参数和系统调用,lib.rs 负责核心逻辑。 TDD:测试驱动开发。 环境变量:支持 IGNORE_CASE=1 进行大小写不敏感搜索。 2. 核心代码演进 我们将代码分为 main.rs 和 lib.rs。 2.1 参数解析与配置 在 src/lib.rs 中定义 Config 结构体: 1use std::env; 2 3pub struct Config { 4 pub query: String, 5 pub file_path: String, 6 pub ignore_case: bool, 7} 8 9impl Config { 10 pub fn build(mut args: impl Iterator<Item = String>) -> Result<Config, &'static str> { 11 args.next(); // 也就是程序名,通常忽略 12 13 let query = match args.next() { 14 Some(arg) => arg, 15 None => return Err("Didn't get a query string"), 16 }; 17 18 let file_path = match args.next() { 19 Some(arg) => arg, 20 None => return Err("Didn't get a file path"), 21 }; 22 23 let ignore_case = env::var("IGNORE_CASE").is_ok(); 24 25 Ok(Config { 26 query, 27 file_path, 28 ignore_case, 29 }) 30 } 31} 注意这里使用了 impl Iterator,这样我们可以直接消费 env::args(),更加高效。 ...

2025-11-04 · 2 min · 344 words · 老墨