利用tmux和nvim的方式远程开发

把 tmux、nvim、SSH 和命令面板组合成一个可恢复的终端远程开发工作流。

#type / synthesis #status / evergreen #tech / dev #resource / tmux

[!info] related notes

利用tmux和nvim的方式远程开发

为什么要把这几个工具一起理解

  • SSH 负责把你接入远端机器
  • tmux 负责在远端保留会话与进程
  • nvim 负责在终端里直接编辑代码
  • 额外窗格可以放日志、服务、Git 命令或 AI 助手

这几个工具单独看都不复杂,但组合起来会形成一个很稳定的“断线可恢复、键盘优先、低带宽也能工作”的开发环境。

最小工作流

  1. ssh 连接到远端机器或 WSL 环境
  2. 进入 tmux:
    • 没有会话就 tmux
    • 已有会话就 tmux attach
  3. 把左侧主窗格给 nvim
  4. 右侧或下方窗格分别给服务、日志、Git 命令、AI 助手
  5. 离开时 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 / pushtmux popup 里的 lazygit
rebase / 冲突解决 / 大改动专门的 git window
边写代码边看 difftmux 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 暴露到公网

推荐学习方向

博客 / 频道偏向
ThePrimeagenVim / tmux / i3 整体工作流思想
Josean Martinez干净可复制的终端配置(Neovim、tmux、lazygit)
Dreams of Code现代开发环境、Docker、工具链
typecrafttmux / Neovim / Git 系统学习
DevOps ToolboxDevOps、Linux、Neovim + tmux 远程开发
创建于 2026/2/26 更新于 2026/7/15