写在前面
这类文章在互联网上其实已经泛滥了,我本来也不打算写。但一方面某些工具确实改变了我的工作方式,值得记录一下;另一方面我有不少朋友问过我类似的问题,与其每次重复解释,不如写成文章。
先说清楚一点:工具这种东西有非常浓厚的个人色彩,没有好坏优劣之分,只是每个人看重的东西不一样。「差生文具多」这句话本质上是一种自嘲,不是用来攻击别人的武器;同理,用某个工具也不应该成为你炫耀的资本。把工具本身当成某种身份符号,反而本末倒置了——有点像崇拜那个你在哪里读书而不是你读了什么书一样。求同存异,工具服务于人就好。
我的选型理念
大概有这么几条原则,按重要程度排列:
- 开源优先:不是为了装,是为了在厂商「喂屎」的时候有得选。《自由软件,自由社会》我虽然没完整读过,但那个道理我是认同的。商业公司不是慈善机构,功能阉割、涨价、后门——当你的迁移成本高到一定程度,你就只能吃屎。
- 跨平台:我同时在用 macOS 和 Linux,偶尔还要连一些 Linux 服务器,一个只能在一个平台用的工具对我来说打折扣。Windows 现在用得少了,但也不是完全不接触,选工具时的标准是至少「能用」就行,不需要体验完美。Windows 上 CLI 生态和 UNIX 系确实不在一个量级,如果真要在 Windows 上做点什么,基本上也是开个 WSL 解决,而不是指望 cmd/PowerShell 那边。
- 不被 vendor locked:和开源有关联,但不完全一样。核心配置最好是纯文本的,这样我可以用 git 管理,随时迁移,不依赖任何厂商的同步服务。
- 不 all-in-one:一个工具做好一件事(UNIX 哲学),然后组合使用。把所有东西塞进一个超级 App 听起来很方便,实际上某一部分拉垮了你整个工作流都得跟着受苦,还有隐私风险集中的问题。
- 极简+实用主义,CLI 和 GUI 并用:能用 CLI 解决的问题不一定非要 GUI,但有好的 GUI 我也不排斥,不存在「用 GUI 就是不够 hardcore」这种奇怪观念。
当然,有些领域受制于现实情况,或多或少会违背上面的原则。特定场景特定分析,后面会提到。
操作系统 / 设备
主力设备
- 工作:公司发的 Mac(具体型号懒得说,反正不是自己买的,用着就行)
- 个人:自己买的 Mac mini + 一台装了 ArchLinux 的老笔记本(Magicbook 2019)+ 一台 2019 款 MacBook Pro(发热降频严重,但内存相对大,勉强还能用,主要用来跑一些对算力有一定要求的本地任务)
- 手机:Android 日常 + 老 iPhone 备用,基本只用来打电话、刷视频、MFA验证之类的
- 小型 VPS:自建一些服务用
为什么用 Linux
之前专门写过一篇:笔记本折腾Linux碎碎念。简短版本:Windows 在这台老机器上已经烂到不可接受,而且微软近年来的所作所为(Recall、强制更新、莫名其妙的后台服务……)让我实在没有继续用的理由。装 ArchLinux 之后内存占用从 70%+ 直接降到 400MB,老机器焕然一生。
不过 Linux 桌面确实有门槛,适不适合自己去试试才知道。不建议盲目劝人装 Linux。
窗口管理器
这个其实不跨平台,但体现了相似的核心理念,单独说一说。
平铺式窗口管理器这种东西,用过就很难回去了。从此告别疯狂用鼠标拖窗口,屏幕空间利用率高,还有一种「掌控感」。当然这属于「磨刀」,一开始肯定要花一些时间配置,但 macOS 上的其实还好,Windows 不了解有没有类似的,我感觉应该只多不少。
macOS 上还配合 Hammerspoon 一起用。它本身也只有 macOS 版,但背后的理念是通用的——用 Lua 脚本直接操控系统,窗口管理、快捷键绑定、应用切换启动,想做什么写几行代码就行。这类工具的魅力不在于功能列表,而在于可以自己写,配置是纯文本,自由度极高,折腾的乐趣也在这里。
和 Aerospace 的分工大概是:Aerospace 负责平铺布局,Hammerspoon 补那些 Aerospace 覆盖不到的地方,比如更灵活的热键逻辑、跟自己其他脚本联动之类的。之所以 Linux 上不需要类似的工具,是因为可以直接选一个以平铺为设计核心的窗口管理器,整个生态和社区都围绕这个思路,大多数场景都有现成的办法。macOS 底层桌面环境本质上还是层叠式的,Aerospace 是在上面「模拟」平铺,兼容和边界问题就多了,Hammerspoon 正好补这部分空缺。
Linux 上配 i3/sway 还会顺带用 polybar / waybar 做状态栏,dunst 做通知,这些基本配好就不怎么动了,属于搭好底盘就能跑的东西。
键位重映射
Karabiner-Elements(macOS)
Karabiner-Elements 也是 macOS 独占,但解决的问题很通用——键位重映射。
最基础的用法是把 Caps Lock 和 Ctrl 互换,macOS 原生也支持这个,但 Karabiner 能做更多。比如外接键盘时自动禁用内置键盘,这样就可以把外接键盘直接放在笔记本 C 面上使用,不用担心误触;还能针对不同键盘做不同的映射规则,灵活度远超系统设置。
Linux 上类似的需求可以直接用 xkb 或者 keyd 解决,也有社区整理好的配置可以直接拿来用。
终端
终端模拟器
主力用 Alacritty,配置是 TOML 文件,极简,GPU 加速,跨平台。需要图片显示这类高级功能时切 Ghostty,开箱即用,甚至自带 Nerd Font,懒得折腾的话 Ghostty 其实是更好的第一选择。
Shell
Fish 是主力,在 Linux 服务器上遇不到 fish 的时候用 bash/zsh。具体理由之前也写过:Why I try fish over zsh。
核心是:autosuggestion 和 completion 开箱即用,不需要 oh-my-zsh 那一套,配置是纯文本,方便 dotfiles 管理。
tmux
多窗口、分屏、会话持久化,在服务器上用得很顺手。配置文件是纯文本,跟着 dotfiles 走。
没什么好说的,就是好用,tmux-cheatsheet 备用查查。
缺点也是有的,说几个我实际踩过的:
- 复制粘贴麻烦:和系统剪贴板打通需要折腾,Linux 上尤其烦(特别是远程机器),macOS 稍微好一点,但也需要配置
- 颜色/
$TERM问题:这个感受最明显的场景是和 Ghostty 一起用——Ghostty 默认的$TERM是xterm-ghostty,进了 tmux 之后颜色或者某些转义序列就开始乱,或者干脆进不去,经常要手动export TERM=xterm-256color才能正常,或者在 tmux 配置里强制设置。总之就是各种地方在互相"不认识对方" - 鼠标支持:默认不开启,开了之后行为也和普通终端不太一致,滚动、拖拽选中都需要额外适应
- prefix 键心智负担:所有操作都要先按一下 prefix(我用的
Ctrl+a),SSH 套 tmux 再套 tmux 的时候 prefix 冲突是噩梦,需要手动发送 prefix 到内层 - 本地场景价值相对有限:本地分屏习惯上还是用 tmux,但终端模拟器本身或者窗口管理器也能分屏,特殊情况下会用。相比之下,tmux 在远程服务器上的价值更突出——会话持久化、断线重连,这两点其他工具替代不了
编辑器
日常:Neovim
主力编辑器。极度可定制,配置是纯 Lua 文本文件,跟着 dotfiles 走,任何设备都能快速复现;在远程服务器或嵌入式设备上,有时候 Vim/Neovim 几乎是唯一选项,趁早熟悉有好处;学习曲线是真实存在的,但对我来说投入是值得的。
之前写了不少 Vim/Neovim 相关的文章,比较有代表性的是这篇。
我没有把它配置成一个「假 IDE」,LSP、补全、模糊搜索该有的都有,但尽量保持轻量。
Java:IntelliJ IDEA
写 Java/读 Java 代码的时候,IDEA 还是最好用的。这是现实考量,没什么好纠结的,合适的场景用合适的工具。
备用:VS Code
remote-ssh 的场景下偶尔用,或者临时打开一个不熟悉语言的项目。不作为主力。
浏览器
日常主力 Firefox,理由:
- 开源,Mozilla 基金会背景,相对最不"邪恶"
- uBlock Origin 满血版。Chromium 系浏览器因为 Manifest V3,uBlock Origin 被大幅降级——谷歌以「性能和安全」为由推行这套新规范,实际效果是大幅限制了扩展对网络请求的拦截能力。这其实是一个教科书级的「厂商强迫你」案例:你用的是谷歌的浏览器,规则就得谷歌来定,而谷歌的广告业务恰好和广告拦截器是对立关系——利益冲突摆在那里,你信不信是你的事。Firefox 目前还没有跟进,这是我强烈倾向于 Firefox 的核心理由之一
- 可以原生配置代理,不依赖任何插件。这一点比听起来重要——用 Chromium 系浏览器配代理,通常要装扩展,而装扩展要访问 Chrome Web Store,但访问 Chrome Web Store 本身可能就需要代理。这个先有鸡还是先有蛋的 bootstrap 问题,Firefox 原生代理设置直接绕过去了
国内网站为主时换 ungoogled-chromium,有时备用 Brave,工作用 Google Chrome(没得选,公司有时候有内部工具只测了 Chrome)。
AI 工具
AI 工具是这份清单里和我选型理念冲突最明显的地方。
开源大模型确实存在,也有很多本地部署方案,但要跑一个真正有竞争力的大规模模型,对硬件的要求摆在那里——这篇 B 站视频(花5万买Mac Studio跑AI值不值?)的作者买了台 5 万的 Mac Studio 跑了一年,才算是真正摸到了本地大模型的天花板在哪里。对普通人来说,纯从经济账算不一定划算,性能也比不过云端 API。
但我觉得原则是没错的。重要的不是你现在选了什么,而是你有得选——尤其是在数据隐私敏感的场景下,能不能不把数据喂给第三方,这个选项本身就有价值。所以本地部署这条路我还是在探索,只是暂时受限于硬件,主力还是在线模型。
这块比较复杂,专门写了一篇讲本地部署:工欲善其事,必先利其器(二),AI 编码这块后面也有计划单独写。
在线模型
- ChatGPT、Claude、DeepSeek 都在用,受限于付费计划,私人场景下 ChatGPT 用得相对多
- 工作上 Claude / Cursor / OpenCode / Codex 都用,体感各有优劣,这个坑后面填
本地部署
Ollama 管理模型,搭配 Open WebUI 提供界面,跑一些对隐私有要求或者不需要顶级模型能力的场景。硬件有限,主要跑量化后的中小模型。
输入法
这个勉强跨平台,但实现方式不同:
- macOS:系统自带五笔,配置到可接受的程度,懒得折腾
- Linux:Rime + fcitx5,五笔方案,之前写过安装步骤:ArchLinux + i3 下的Rime输入法安装和使用
用五笔是因为用了多年,习惯了,重码率低,在模糊拼音横行的年代打字准确度有优势。新人不一定要学,学习成本不低,收益不见得高。
CLI 工具
这类工具太多,只说几个用得高频的:
- fzf:模糊搜索神器,配合 shell 历史、文件查找用,之前专门写过:An Introduction to FZF
- ripgrep:比 grep 快,默认忽略 .gitignore,代码搜索日常用
- fd:find 的现代替代,语法更友好
- bat:cat 的替代,自带语法高亮和行号,看文件顺眼很多
- yazi:终端文件管理器,之前用 ranger,后来换到 yazi,默认配置就很好用,性能也更好
- lazygit:Git TUI,终端里快速处理 git 操作,不想每次都打一堆 git 命令的话非常顺手
笔记 / 知识管理
这里有点个人色彩——我认为「笔记软件」这个说法不够准确,更核心的是笔记思路,工具是次要的。
核心是纯文本文件(Markdown 为主),存在自己的服务器上。同步方式视场景而定:git 适合有版本历史需求的内容;Syncthing 适合多设备实时同步;rsync / rclone 更适合定期备份或往远端推,rclone 还能对接各种云存储后端。
其他:
- 分类大概是:临时记录(随手记,不做整理)、TODO(简单文件搞定,不需要专门 App)、长期文档(按主题归档)
- Obsidian 偶尔用来看看它的 graph view 之类的功能,但核心工作流还是用普通编辑器打开文件,不依赖 Obsidian 特有的功能
原则:数据和工具解耦。哪天 Obsidian 不好用了,文件还是那些文件,换个编辑器打开就行。
dotfiles
所有工具的配置文件都放在 dotfiles 仓库里,用 git 管理,换机器时 clone 下来就能快速复现环境。
具体的管理方式是用软链接——把配置文件的实体放在 git 仓库里,然后在系统对应的位置建软链接指向它。这样配置文件的修改直接反映在 git 仓库里,同步和版本回退都很自然,不需要依赖任何专门的同步工具。GNU Stow 可以自动化管理这些软链接,不过手动维护也完全可以。
仓库里也有安装脚本,理念是换机器时能一键把常用工具和配置都跑起来,虽然这类脚本时间久了容易欠维护,但思路是对的。
这是我觉得比任何具体工具都重要的一个习惯。纯文本配置 + 版本控制,这两样东西配合起来,带来的掌控感和迁移自由度是任何闭源同步服务都给不了的。
密码管理
这个我比较反常,没用专门的密码管理器——用的是一套自己的密码规则 + MFA。
这套方案的缺点是显而易见的(规则一旦被猜出来就比较危险),但好处是不依赖任何第三方服务,不担心服务商被黑或跑路。这是个权衡,我不建议所有人都这样做,Bitwarden(可以自托管)或 KeePassXC 都是更主流的选择。
博客
这个博客用 Hugo 生成,托管在 GitHub Pages 上,源码也是公开的。纯静态,不需要服务器,内容是 Markdown 文件,完全掌控在自己手里。
总结
回到开头说的那几条原则:开源、跨平台、不被 vendor locked、不 all-in-one、极简实用主义。不是每个工具都完美符合,但作为选型时的参考框架,帮我省了很多「被坑」的麻烦。
如果你也有类似的工具理念,欢迎交流;上面提到的工具每个展开都能单独写一篇,有哪个感兴趣的也欢迎留言。我的 dotfiles 随时可以参考,虽然里面废配置也不少,有空再整理。