-
Ctrl+R搜历史命令,而不是重新敲。 原生 shell 就能用;再装fzf后体验会好很多。以前敲过的超长curl、kubectl、git命令,输入几个关键词就能找到。bashbrew install fzf -
用
zoxide替代反复cd ../../xxx。 它会学习你常去的目录。bashbrew install zoxide eval "$(zoxide init zsh)"以后:
bashz tools z rust z mdbook -
用
rg替代grep -R。 搜代码快、默认忽略.gitignore、输出漂亮。bashrg "context.WithCancel" rg "TODO" --type go rg "unsafe" crates/ -
用
fd替代大多数find。bashfd '\.rs$' fd main.go fd -e js比:
bashfind . -type f -name '*.js'更适合日常使用。
-
pbcopy/pbpaste是 macOS 程序员神器。bashgit diff | pbcopy pbpaste > /tmp/a.txt cat ~/.ssh/id_ed25519.pub | pbcopy终端和 GUI 之间几乎零成本搬数据。
-
输出直接打开,不要先 Finder 找文件。
bashopen . open README.md open report.pdf open https://github.com/golang/goopen .尤其高频。 -
Finder 中选中文件按
Space快速预览。 PDF、图片、视频、Markdown、代码、Office 文件很多都不用真正打开应用。 -
截图直接进剪贴板,不制造桌面垃圾。
⌘ + Control + Shift + 4→ 框选 → 直接去 Slack/微信/GitHub 粘贴。 -
⌘ + Shift + 4后按 Space,只截一个窗口。 写 Issue、PR、文档时非常方便。 -
用剪贴板历史。 如果一天复制几十次内容,这是最值得开启的功能之一。Raycast、Alfred 等都能做。复制过的 IP、命令、URL、代码片段都不用重新找。
-
给 Git 设置高频 alias。
bash
git config --global alias.st status
git config --global alias.sw switch
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.cm commit
git config --global alias.last 'log -1 --stat'
最重要的不是少敲几个字符,而是降低操作摩擦。
- 配置一个真正有用的 Git log。
bash
git log --graph --decorate --oneline --all
可以设置:
bash
git config --global alias.lg \
"log --graph --decorate --oneline --all"
- 养成用
git switch/git restore的习惯。 它们比老式checkout的语义清晰:
bash
git switch main
git switch -c fix/foo
git restore foo.go
- 只提交一个文件中的部分修改:
git add -p。
bash
git add -p
一个文件改了 bug、重构、debug 日志三件事,也能拆成干净 commit。
- 撤销刚刚 stage 的内容,不撤销代码。
bash
git restore --staged foo.go
- 提交前永远看一次 staged diff。
bash
git diff --cached
比单纯 git diff 更重要,因为这才是真正准备提交的内容。
- 忘了某段代码什么时候被改,用
git blame+git log -L。
bash
git blame foo.go
git log -L 120,170:foo.go
后者会告诉你某几十行代码的演化历史。
- 丢 commit 先查
git reflog,不要慌。
bash
git reflog
reset、rebase、误删 branch 后,大多数情况下 commit 其实还在那里。
- 找"哪个 commit 引入 bug",学会
git bisect。
bash
git bisect start
git bisect bad
git bisect good v1.2.0
对大型项目尤其省时间。
- 频繁 rebase 时开启
rerere。 Git 会记住你解决 conflict 的方式。
bash
git config --global rerere.enabled true
同一批冲突以后再出现,Git 可以自动复用解决方案。
- 修前一个 commit 用
--fixup。
bash
git commit --fixup <commit>
git rebase -i --autosquash <base>
做 PR 时特别舒服,不必自己手工移动和 squash commit。
- 比较两版 patch,用
git range-diff。 PR rebase/修改几轮后非常有价值:
bash
git range-diff main...old main...new
它回答的不是"最终文件哪里不同",而是"这一轮 patch 相比上一轮改了什么"。
- 同时维护两个分支,用
git worktree,不要反复 stash。
bash
git worktree add ../project-fix fix-branch
你可以同时拥有:
text
project/ main
project-fix/ fix-branch
对开源贡献非常实用。
- 临时保存修改时给 stash 命名。
bash
git stash push -m "WIP parser fix"
git stash list
不然半个月后看到 stash@{7} 根本不知道是什么。
- 只 stash 一部分内容也可以。
bash
git stash -p
- 查看某文件改动统计,不必打开 GitHub。
bash
git log --stat -- path/to/file
git log -p -- path/to/file
- 不知道命令输出怎么处理,优先考虑管道。
bash
command | rg xxx
command | sort
command | uniq -c
command | jq .
command | pbcopy
Unix 的效率很多就来自这里。
- JSON 永远不要肉眼看一整坨,交给
jq。
bash
curl ... | jq .
curl ... | jq '.data.items[] | {id,name}'
API 调试能省非常多时间。
- 查 JSON 某个深层字段:
bash
jq -r '.data.user.name'
-r 可以去掉字符串外面的引号。
- 大文件别习惯性
cat。 用:
bash
less huge.log
在 less 里:
text
/error 搜索
n 下一个
N 上一个
G 文件末尾
g 文件开头
日志排错非常高频。
- 实时日志别一直重新执行命令。
bash
tail -f app.log
如果想同时过滤:
bash
tail -f app.log | rg --line-buffered ERROR
- Shell 光标操作别一直按方向键。 常用几个足够:
text
Ctrl+A 行首
Ctrl+E 行尾
Ctrl+U 删除光标前全部
Ctrl+K 删除光标后全部
Ctrl+W 删除前一个单词
Ctrl+L 清屏
一天能用几十次。
- 上一条命令忘加 sudo:
bash
sudo !!
!! 就是上一条命令。
- 上一条命令的最后一个参数:
bash
!$
例如刚执行:
bash
mkdir /tmp/very-long-directory-name
接下来:
bash
cd !$
-
复杂命令先在命令行里编辑,不要删掉重敲。 zsh/bash 可以设置
$EDITOR后用 shell 的编辑模式;或者直接利用终端支持的多行编辑。特别长的curl、SQL、Git 命令很有价值。 -
给项目创建
.envrc+ direnv。 进入目录自动设置环境变量,离开自动取消:
bash
brew install direnv
项目里:
bash
export GOPRIVATE=xxx
export RUST_LOG=debug
不用每天重新 export。
- 临时 HTTP Server 不要写程序。
bash
python3 -m http.server 8000
当前目录立即变成静态文件服务器。
- 想知道是谁占了端口:
bash
lsof -i :8080
lsof -nP -iTCP:8080 -sTCP:LISTEN
Mac 上排服务问题非常常用。
- 找到进程后不用复制 PID 再 kill,可以组合起来。
bash
lsof -ti :8080 | xargs kill
确认无误后才考虑 kill -9。
- 查看程序到底从哪里来的:
bash
which go
type go
command -v go
PATH、多个 Go/Rust/Java 版本冲突时,第一时间执行它。
-
Safari/Chrome 网页搜索直接用
⌘+F,但更重要的是浏览器标签搜索。 Chrome 系浏览器⌘+Shift+A可以搜所有已打开标签。开 50 个 GitHub 页面时非常好用。 -
误关标签页:
⌘+Shift+T。 可以连续按,恢复前面多次关闭的页面甚至窗口。这应该形成条件反射。 -
⌘+L直接聚焦地址栏。 不需要鼠标点地址栏:
text
⌘L
输入关键词
Enter
搜索、跳网站、复制当前 URL 都更快。
- 浏览器配置"站内搜索快捷词"。 例如设置:
text
gh rustfmt
自动变成 GitHub 搜索;
text
go context
搜 pkg.go.dev;
text
mdn fetch
搜 MDN。对于经常查文档的人,这是非常大的提效点。
- DevTools 里用
⌘+Shift+P打开 Command Menu。 和 VS Code Command Palette 很像,可以直接搜索:
text
screenshot
disable cache
coverage
javascript
不必记某功能藏在哪个菜单里。
- Network 请求直接 Copy as cURL。 浏览器里找到请求 → Copy → Copy as cURL,然后丢进终端:
bash
curl 'https://...' \
-H 'authorization: ...'
调接口、复现前端问题时,比自己拼请求快很多。
-
Chrome DevTools 的 Preserve log 很值得开启。 页面跳转、OAuth 重定向、登录失败时,如果不开它,上一页请求记录可能瞬间没了。
-
不同工作身份使用不同 Browser Profile。 比如:
text
Personal
Work
Open Source
Testing
GitHub 登录态、Google 账号、插件、Cookies 完全隔离。比不停退出登录省事很多。
- 给重复操作写 shell function,而不仅仅是 alias。 Alias 适合:
bash
alias k=kubectl
Function 可以做真正的小工具:
bash
mkcd() {
mkdir -p "$1" && cd "$1"
}
以后:
bash
mkcd /tmp/test/foo
如果一个操作一周重复 3 次以上,我就会考虑把它自动化。
- 终极原则:把"检索"替代"整理"。 不要花太多时间维护完美目录结构、几十层书签、几百个标签。保证东西容易被搜索到 更重要。文件用 Spotlight/
fd,代码用rg,历史命令用fzf,Git 历史用log,浏览器用标签搜索,剪贴板用历史搜索。真正熟练以后,你的工作模式会从:
text
我把它放在哪里了?
↓
打开目录
↓
一层层找
变成:
text
⌘Space / rg / fd / Ctrl+R
↓
输入 3~5 个字符
↓
找到
其中我最建议优先装的几个工具,其实就这么点:
bash
brew install \
ripgrep \
fd \
fzf \
zoxide \
jq
然后 .zshrc 至少加上:
bash
eval "$(zoxide init zsh)"
如果只能先练 10 个 ,就练 Ctrl+R + fzf、zoxide、rg、fd、pbcopy/pbpaste、git add -p、git reflog、git worktree、浏览器 ⌘L/⌘⇧A/⌘⇧T、DevTools Copy as cURL。这几个属于一旦习惯后,很难再回到原来的操作方式。