利用tmux和nvim的方式远程开发
把 tmux、nvim、SSH 和命令面板组合成一个可恢复的终端远程开发工作流。
#type / synthesis
#status / evergreen
#tech / dev
#resource / tmux
[!info] related notes
利用tmux和nvim的方式远程开发
为什么要把这几个工具一起理解
SSH负责把你接入远端机器tmux负责在远端保留会话与进程nvim负责在终端里直接编辑代码- 额外窗格可以放日志、服务、Git 命令或 AI 助手
这几个工具单独看都不复杂,但组合起来会形成一个很稳定的“断线可恢复、键盘优先、低带宽也能工作”的开发环境。
最小工作流
- 用
ssh连接到远端机器或 WSL 环境 - 进入 tmux:
- 没有会话就
tmux - 已有会话就
tmux attach
- 没有会话就
- 把左侧主窗格给
nvim - 右侧或下方窗格分别给服务、日志、Git 命令、AI 助手
- 离开时
detach,下次再接回原会话
完整日常流程
推荐用两个终端分工:
Windows Terminal
├─ Tab 1: SSH + tmux,写代码、跑服务、看日志
├─ Tab 2: SSH tunnel,只负责端口转发
└─ Browser: localhost:5173,看页面
Terminal 1:进入远程 tmux
ssh do-dev -t "tmux new -A -s bodysense"
进入后开窗口:
tmux rename-window nvim
tmux new-window -n dev
tmux new-window -n git
tmux new-window -n logs
tmux new-window -n db
在 dev 窗口启动服务:
docker compose up -d
# 或
pnpm dev
Terminal 2:端口转发
ssh -N \
-L 127.0.x.x:5173:localhost:5173 \
-L 127.0.x.x:8080:localhost:8080 \
-L 127.0.x.x:8000:localhost:8000 \
do-dev
-N 表示不进入终端,只做端口转发。127.0.x.x 确保只有本机可以访问转发端口。
Browser:本地预览
打开 http://localhost:5173,通过 SSH 隧道访问远程服务。详见 SSH 端口转发与远程开发。
tmux 窗口组织原则
一个项目一个 tmux session,每个窗口承担一种长期职责:
session: bodysense
window 1: nvim → 写代码
window 2: web → 前端 dev server / 日志
window 3: api → 后端服务 / 日志
window 4: ai → Python AI 服务 / 日志
window 5: git → lazygit / git 操作
window 6: infra → docker compose / psql / redis-cli
不要把所有东西都挤在一个窗口里。一个窗口只承担一种职责,最不乱。
Git 操作该用什么方式
| 场景 | 推荐方式 |
|---|---|
| git status / commit / push | tmux popup 里的 lazygit |
| rebase / 冲突解决 / 大改动 | 专门的 git window |
| 边写代码边看 diff | tmux pane 分屏 |
tmux popup 配置(在 ~/.tmux.conf 中):
bind-key g display-popup -E -w 90% -h 90% 'lazygit'
按 Prefix + g 弹出 lazygit,操作完 q 退出,回到代码窗口。详见 lazygit。
状态检查
远程开发时排查问题需要从多个层面验证。详见 远程开发状态检查。
快速检查清单:
# 进程状态
docker compose ps
ss -lntp | grep 8080
# HTTP 状态
curl http://localhost:8080/health
curl -I http://localhost:5173
# 浏览器状态
# 本地浏览器打开 http://localhost:5173
# DevTools → Network / Console
# 数据状态
psql "$DATABASE_URL"
redis-cli -u "$REDIS_URL"
为什么 tmux 是核心
如果只有 SSH 和编辑器,那么断线、关终端、切设备时,当前现场很容易丢。
tmux 提供的是中间那层“工作空间管理”:
- 编辑器和服务都留在服务器上
- 本地终端只是一个入口
- 网络中断不会直接结束你的工作现场
这也是它适合远程开发的原因。
布局恢复有三条路
- 只要当前 tmux server 不退出,直接
attach回去即可 - 想恢复上一次现场,用 tmux 中保持布局 里的
tmux-resurrect - 想固定生成项目布局,用脚本或 tmuxinator
适合的场景
- 远程 Linux 服务器开发
- WSL 内长期运行服务
- 网络不太稳定,但又希望工作环境不中断
- 喜欢键盘优先、TUI 工具链的开发方式
边界
- 如果你更依赖 GUI 调试器、图形化文件树、IDE 插件生态,VS Code Remote 这类方案通常更直接
- 如果只是偶尔改一个远端文件,没有必要把工作流复杂化到 tmux + nvim 全套
- Web 预览用 SSH 端口转发,不要把 dev server 暴露到公网
推荐学习方向
| 博客 / 频道 | 偏向 |
|---|---|
| ThePrimeagen | Vim / tmux / i3 整体工作流思想 |
| Josean Martinez | 干净可复制的终端配置(Neovim、tmux、lazygit) |
| Dreams of Code | 现代开发环境、Docker、工具链 |
| typecraft | tmux / Neovim / Git 系统学习 |
| DevOps Toolbox | DevOps、Linux、Neovim + tmux 远程开发 |