从结构上理解 tmux

最近用 Google NotebookLM 整理了一套讲 tmux 的幻灯片,15 页。大多数教程上来就让你背快捷键,能照抄,但过两周就忘。这套先把 tmux 的结构和设计讲清楚,键位反而变成顺理成章的东西。

三个设计出发点

tmux 到底解决了什么,就三件事:

  • 持久化:终端关了,会话还在。SSH 断线不用重来。
  • 多路复用:一个终端里开一堆 shell。
  • 可移植~/.tmux.conf 一搬,换个机器手感一样。

四层结构

tmux 的一切都建立在这四层上:Server → Session → Window → Pane

  • Server:本机只跑一个后台进程,所有会话都挂在它下面。
  • Session:一次工作区,通常一个 SSH 连接对应一个会话。
  • Window:会话里的标签页。
  • Pane:窗口里切成的一块块,每块是独立的 shell。

Client 和 Server 分离

这是整套设计的核心。终端窗口只是个 client,真正的状态都在 Server 上,client 断掉、重连,Server 照跑。持久化就是这么来的。

前缀键

tmux 接管了终端之后,得区分”这个按键给 shell 还是给 tmux”,于是有了 Prefix(默认 Ctrl+b):先按前缀打招呼,再说正事。理解了这一点,键位就全不用背了。

操作天然对得上层级:

  • PanePrefix + % 竖切," 横切,方向键切换,x 关掉
  • WindowPrefix + c 新建,0-9 切换,p/n 前后
  • SessionPrefix + d 分离,s 打开会话树

复制模式

Prefix + [ 进入复制模式,用 Vim 键位上下翻、选、复制。tmux 自己维护屏幕缓冲区,复制也得过它一道。

自己绑键

Ctrl+b 两级有点慢,很多人把常用的直接绑到 Alt 上,Alt+1 切窗口、Alt+方向键 切窗格。这就是 bind -T root 干的事——在不按前缀时直接响应。配合 if-shell 和 Format 还能做条件绑定,比如只有左边还有窗格时才往左移。

状态栏

status-left / status-right 可以放文本、颜色,甚至嵌入 shell 命令的输出(uptime 之类),status-interval 控制刷新频率。状态栏其实是块可编程区域。

进阶玩法

幻灯片最后列了一批:SSH Armor(SSH 断了会话不丢)、Session Resurrect(重启后恢复会话)、Pane 边框高亮、快速调整大小。都是在四层结构上做文章。

对我来说最有价值的其实是那四层结构。之前记不住键位,就是因为不知道它们挂在哪个层级下面;结构清楚了,键位自己就记住了。

附:这套幻灯片 PDF 原件(15MB)可以在这里下载