目标#
构建一个实用高效的终端开发环境,支持 AI Agent 辅助编程,完善的远程 SSH 开发体验,以及跨设备的工作流同步。
当然也要酷炫好看,参考头图!
我的配置repo ↗,涉及到的配置文件都在此仓库中,欢迎参考。
本篇博客将介绍核心架构与工具选择,其他内容见:
核心架构与工具#
整个环境基于 Ghostty ↗ + Zsh ↗ + Neovim (LazyVim) ↗ + OpenCode ↗ + Tmux ↗ 构建,并使用 Tailscale ↗ 实现远程访问。
📝 Neovim (LazyVim)
终端 IDE — LSP / DAP / 补全
🤖 OpenCode AI Agent
上下文理解 / 终端任务执行
Zsh 插件:autosuggestions · syntax-highlighting · vi-mode
1. 终端模拟器:Ghostty#
- 定位:基于 Zig 开发的高性能终端。
- 选择理由:启动速度快,GPU 加速渲染流畅,配置简单且支持原生 UI 体验,主题系统也很完善。
2. Shell:Zsh#
- 定位:命令解释器。
- 选择理由:拥有丰富的插件生态(如 autosuggestions, syntax-highlighting),能显著提升命令行的操作效率。
3. 编辑器:Neovim (LazyVim)#
- 定位:终端版 IDE。
- 选择理由:
- LazyVim:基于 Neovim 的开箱即用配置,扩展方便。
- 高效:纯键盘操作,资源占用低,启动极快。
- 功能完整:具备完整的 LSP、调试和代码补全能力。
4. AI Agent:OpenCode#
- 定位:AI Agent 编程助手。
- 选择理由:
- 强大的 Agent:更能理解上下文并在终端中执行复杂任务,辅助日常开发,也可以开发更多作用和玩法。
- 开源:如果存在多个软件可以实现相同/相近的功能,个人偏好开源/好看的那一个。比较喜欢与模型解耦提供更多的选择以及学习魔改的机会。
5. 远程与会话管理:Tmux + Tailscale#
这套组合用于解决”后台运行”和”远程连接”的问题。
-
Tmux (终端复用)
- 解耦:核心价值在于将运行的任务与当前的终端窗口彻底解耦。
- 持久化:常规终端关闭窗口即意味着进程结束,而 Tmux 会话独立于前台窗口存在。无论是本地误关还是 SSH 网络波动,运行在其中的 Neovim 编辑器和后台服务都会保持运行,毫发无损。
-
Tailscale (异地组网)
- 不仅是 VPN:基于 WireGuard 构建私有局域网。利用 P2P 打洞技术实现设备直连,带宽和速度远优于经过中转服务器的传统方案。
- 安全隐蔽:这是在个人服务兴起背景下被严重低估的选择。相比传统内网穿透需将服务暴露在公网,Tailscale 不需要暴露任何端口。你的开发环境只有你自己能通过私有网络 IP 访问,从入口层面杜绝了外部扫描风险,是兼顾便利与安全的优选。
典型场景:出门后用其他设备继续工作
,PUA&压榨 AI AgentPhone → Tailscale P2P → SSH → Zsh →
tmux attach→ 恢复完整工作环境✅ (Neovim/OpenCode工作区和会话 + 后台服务完好)远程 SSH 直接连接服务端的 Zsh,通过
tmux attach接回之前的会话。因为 Tmux 将进程与窗口解耦,断线重连/异地连接才能做到无缝衔接,恢复完整工作环境。
效率工具与细节优化#
如果说核心架构决定了上限,那么顺手的 CLI 工具链则决定了日常开发的幸福感。这里不深入 Neovim 和 OpenCode 的复杂配置,主要分享通用的 Shell 环境优化。
1. Shell & Prompt 策略#
选择 Zsh (原生轻量配置) + Starship ✅,放弃 Oh My Zsh
虽然 Oh My Zsh 曾是生态首选,但它本质上是一个“大礼包“,包含了大量插件、别名和主题。这就带来了两个问题:臃肿与功能冲突。
-
功能冲突:它引以为傲的主题系统和许多插件功能,在现代工具链下显得多余,我们有了很多脱离 zsh 命令外的优秀选择。例如我们不需要它臃肿的 Git 别名(有 Lazygit),也不需要它本身较慢的主题引擎。
-
Prompt 方案:Starship ↗
- 定位:极速、跨 Shell 的通用提示符。
- 超越 Oh My Zsh 主题:Starship 是用 Rust 编写的独立二进制程序,不依赖 Zsh 的解析速度,因此性能极强且极其美观。
- 通用性:它不仅支持 Zsh,还能在 Bash、Fish、PowerShell 甚至 Windows CMD 中提供完全一致的体验。无论你切到哪个环境,那个熟悉的、显示 Git 状态、运行耗时和语言版本的漂亮提示符都在那里。
-
Zsh 核心插件:
- zsh-autosuggestions ↗:输入加速。基于历史记录提供浅灰色建议,按右键直接补全,通过肌肉记忆大幅减少击键次数。
- zsh-syntax-highlighting ↗:实时反馈。命令输错显示红色,输对显示绿色,在回车执行前就能发现低级错误。
- zsh-vi-mode ↗:统一操作逻辑。让 Shell 拥有 Vim 的模态编辑能力,与 Neovim 体验保持一致。
2. 现代化 CLI 工具链#
用更现代高效的工具替换传统 Unix 命令,解决慢与难用的痛点。
📂 导航与文件管理#
- zoxide ↗ (替代
cd)- 解决痛点:传统
cd需要逐层记忆和输入路径。 - 方案:智能记录你的访问频率。只需输入
z blog,就能秒跳到/Volumes/MyDisk/MyCode/Blog,彻底告别路径记忆。
- 解决痛点:传统
- eza ↗ (替代
ls)- 解决痛点:
ls无法直观区分文件类型、权限、Git 状态,且显示单调。 - 方案:现代化的列表工具。支持图标显示(需 Nerd Fonts),能直观展示文件 Git 状态、权限组颜色区分,甚至以树状图展示层级结构,颜值与实用兼得。
- 解决痛点:
- yazi ↗ (替代 Finder/Ranger)
- 解决痛点:终端内浏览文件直观性差,切换 GUI 文件管理器又打断键盘工作流。
- 方案:基于 Rust 的终端文件管理器,不仅速度极快,更难得的是支持在终端内高清预览图片、视频,甚至代码高亮预览。
🔍 搜索与过滤#
- fd ↗ (替代
find)- 解决痛点:
find语法复杂,且默认不过滤node_modules等无关目录,搜索结果嘈杂。 - 方案:语法直觉,默认忽略
.gitignore文件,查找速度极快且自带颜色高亮。
- 解决痛点:
- ripgrep (rg) ↗ (替代
grep)- 解决痛点:在大项目中全局搜索代码内容慢,且容易包含构建产物。
- 方案:目前最快的文本搜索工具之一,尊重
.gitignore规则,是代码检索的神器。
- fzf ↗ (模糊查找)
- 定位:命令行的万能”胶水”,可以接入一切支持标准输出的工具。
- 典型用法:
fd | fzf— 模糊搜索文件并预览,秒开目标rg 'keyword' | fzf— 在搜索结果中交互式跳转Ctrl+R— 模糊反搜历史命令,告别逐条翻找kill配合 fzf — 模糊搜索进程 ID,精准终止
🛠️ 开发辅助#
- Lazygit ↗
- 痛点:Git 命令行对复杂操作(如部分暂存 reset、交互式 rebase)不够直观。
- 方案:终端里的 Git TUI(文本用户界面),全键盘操作,将复杂的 Git 流程可视化,极大降低了心智负担。
- Just ↗ (替代
make)- 痛点:
package.json只能跑 JS 脚本,Makefile语法晦涩难懂。 - 方案:通用的命令运行器。可以为项目(Rust, Go, Ops 等)定义统一的快捷命令,相当于项目级的这类 “Shortcuts”。
- 痛点:
- xh ↗ (替代
curl)- 痛点:
curl参数繁琐,调试 API 时 JSON 格式化不便。 - 方案:保留了 HTTPie 的人性化语法,同时拥有接近 curl 的速度。
- 痛点:
- Direnv ↗
- 痛点:切换不同项目需要手动
activate还可以设置环境变量。 - 方案:进入目录自动加载
.envrc中的环境变量,离开自动卸载,无感切换开发环境。
- 痛点:切换不同项目需要手动
🎨 监控与展示#
- btop ↗:高颜值的资源监控器,支持鼠标操作,界面极具赛博朋克感。
- fastfetch ↗:开机仪式感,高性能系统信息展示工具,Neofetch 的 C 语言替代版,秒开无延迟。
🔄 替代关系速查#
| 分类 | 传统命令 | → | 现代替代 | 核心优势 |
|---|---|---|---|---|
| 导航 | cd | → | zoxide | 按频率智能跳转,告别路径记忆 |
| 列表 | ls | → | eza | 图标 + Git 状态 + 树状结构 |
| 文件管理 | ls & cd | → | yazi | 终端内预览图片/视频/代码 |
| 查找文件 | find | → | fd | 语法直觉,自动忽略 .gitignore |
| 搜索内容 | grep | → | ripgrep | 极速,尊重 .gitignore |
| HTTP | curl | → | xh | 人性化语法 + 自动 JSON 格式化 |
| 构建 | make | → | Just | 通用命令运行器,语法清晰 |
| Git | git cli | → | Lazygit | TUI 可视化,降低心智负担 |
| 环境管理 | 手动 export | → | Direnv | 目录切换自动加载环境变量 |
