原文:tmux for Local Development: A Deep Dive,作者 Jeff Cole,2016 年 5 月发布于 Delicious Brains。 说明:原文站点后来改版(配图换成了静态 PNG 重制版),2016 年的原始动图已无法从线上取得。因此本文配图是在本机 tmux 3.4 里逐条重跑原文的命令与配置生成的复现图,画面内容与原文一一对应(个别差异正文会标注)。复现脚本在仓库
tools/gen_tmux_teardown_figs.py,可自行重放。
为什么拆这篇
这篇教程的特殊之处不在于文字(文字部分就是一份标准的 tmux 入门),而在于它每个概念都配了一张动图或截图,而且配图的终端环境本身就藏着不少东西:定制状态栏、powerline 字体、按键可视化浮层……很多人看完只知道"tmux 好厉害",不知道那些画面是怎么来的。
下面按原文顺序,把 14 张图全部拆开。先花三十秒记住四个名词,后面看图才不懵:
- server:tmux 的后台服务,你关掉所有终端窗口它还在跑,会话都活在它身上。
- session(会话):server 上的一组工作状态,比如"写博客的会话"“跑服务的会话”。
- window(窗口):会话里的一个全屏页面,类似浏览器标签页。
- pane(窗格):窗口里再切分出的小区域,一个窗口可以有好几个 pane,各跑各的 shell。
层级关系是 server → session → window → pane,一层套一层。
第一部分:概念演示图(图 01–06)
图 01:tmux new -s base —— 新建会话

动图演示的是 tmux 的命令结构:tmux <子命令> <参数>。敲下 tmux new -s base 回车后,终端底部出现一条状态栏——这就是"你已经身在 tmux 会话里"的标志。状态栏左边 [base] 0:bash* 表示会话名、窗口编号和窗口里跑的程序(复现环境是 bash;原文作者用 zsh,所以原图显示 [0] 0:zsh),右边是主机名和时间。
两个容易看漏的细节:
- 原图里的状态栏不是 tmux 的默认绿底样式,而是深蓝 session 段加箭头分隔符的定制主题——作者录屏时已经套用了自己的配置,定制方法在原文后半部分(本文图 07–14 会讲;复现图 01 用的是默认绿底,以便先看懂"默认长啥样")。
- 原文图里命令行提示符那两段色块(
~和右侧的时间)是 zsh 主题的功劳(agnoster、powerlevel10k 这类),和 tmux 无关,别搞混了。
图 02:tmux ls —— 会话列表,也是 client-server 架构的证据

| |
这张图没有任何花哨效果,就是纯文本输出,但它展示了 tmux 最重要的架构事实:会话存在 server 上,不在某个终端窗口里。每行字段依次是:会话名、窗口数、创建时间、终端尺寸、是否正被 attach。原文截图里 0 后面带 (attached),表示当时有个客户端连着它(作者正在看这个会话);base 没有,说明它是后台挂着的——终端关了它也死不了,这就是"断开重连工作现场还在"的原理。复现时两个会话都没有客户端连接,所以没有 (attached) 标记。
图 03:tmux switch-client -t base —— 不切窗口换会话

演示的是"客户端还连着 server,但换看另一个会话":执行 tmux switch-client -t base(原文写作 tmux switch -t base,switch 是 switch-client 的旧缩写)后,屏幕内容从会话 0 的命令行换成了会话 base 里正在编辑的文件(原文是写满 Hello World 的 Vim 缓冲区,复现图用 cat hello.txt 示意),底部状态栏的会话段同时从 [0] 变成 [base]——状态栏左侧第一段永远显示当前会话名,这是判断"我在哪个会话"的最快方式。
类似的还有 tmux detach(不杀会话、断开连接)和 tmux attach -t <名字>(重新连上),一拆一接之间,server 上的进程全程无感。
图 04:prefix c —— 新建窗口,看懂状态栏的标记

按 Ctrl-b 再按 c(Ctrl-b 是默认前缀键,后面图 08 会讲怎么换掉它),状态栏的窗口列表从一条变成两条(复现环境跑的是 bash,原图是 zsh):
| |
窗口名默认跟随窗格里正在跑的程序(所以复现图里都叫 bash,原图都叫 zsh)。注意两个小符号:
*标在当前窗口上(这里是 1 号)-标在上一个窗口上(0 号)——用prefix l可以在两个窗口间来回跳,很方便
另外 #、!、~、Z 也都是状态栏标记,分别对应活动通知、响铃、静默、窗格缩放等状态,这套图里没用到。
图 05:prefix % —— 分屏

动图演示把当前窗口切成三个 pane:默认 prefix % 左右分(竖着一条分割线),prefix " 上下分(横着一条线)。切完每个 pane 都是独立的 shell,各跑各的命令,互不干扰;底部状态栏不变,因为 pane 属于窗口内部的事,窗口还是 0 号。
一个反直觉的命名坑:tmux 的参数 -h(horizontal)切出来的是左右两个 pane,-v(vertical)切出来的是上下两个 pane——官方的逻辑是"分割线本身是水平/竖直的"。记不住没关系,图 09 会讲怎么用符号键绕开它。
图 06:两个终端共享同一个会话
原文展示的是两个独立的 iTerm2 窗口,同时 attach 到同一个会话——前面窗口里用 iTerm 自带的查找功能(⌘F)搜索 “grep”,两个窗口里的匹配内容是同步高亮的,因为它们看到的是同一块屏幕。复现图把同一个会话的屏幕并排摆了两份(各自标注 terminal A/B),左侧叠的黄色块就是 iTerm 查找高亮的示意。
实现上没有任何魔法:同一台机器、同一个用户,第二个终端执行 tmux attach -t <会话名>,连到的是同一个 server socket,画面自然实时镜像。跨机器就在远端服务器上跑 tmux,双方 SSH 上去 attach 同一会话——远程结对编程、拉同事进终端救场,靠的就是这个。
第二部分:定制效果图(图 07–14)
从这里开始是原文的 “Customizing tmux” 部分,所有效果都写在 ~/.tmux.conf 里(这个文件默认不存在,自己创建)。
图 07:powerline 风格状态栏
原文定制章节的门面图:左边黄色 base 会话段,中间是灰色窗口列表,右边依次是用户名、日期、时间,段与段之间用箭头符号衔接。复现图完整还原了分段与配色,只是没装补丁字体、箭头退化成普通竖线分隔。做出这个效果要两样东西:
① 打补丁的 Powerline 字体。 那些箭头(、)不是普通字符,是 Unicode 私有区字形(U+E0B0 等),普通字体里没有,终端会显示成方框。原文用的是打过补丁的 Meslo 字体,来自 powerline/fonts 项目,装完还要在终端模拟器的设置里把字体换成它。
② 状态栏分段配置。 两条路线:
- 省事路线:装 tmux-powerline 这类插件,主题自带分段和箭头;
- 手写路线:直接用
status-left/status-right拼,#[fg=…,bg=…]控制每段颜色,例如:
| |
其中 #S 是会话名、#I 是窗口编号、#W 是窗口名,colour220 这类是 256 色板的色号。想完全复刻图里的配色就得逐段调这些色号。
图 08:把前缀键从 C-b 换成 C-a
图里的 ^a 浮层不是 tmux 的功能,是录屏工具的按键可视化(macOS 上 KeyCastr 这类软件),用来告诉观众"我刚按了 Ctrl-a"(复现图右下角叠了一个等效徽标)。真正的变化在配置里:
| |
第三行最容易被忽略但很重要:shell 里 Ctrl-a 本来是"跳到行首",嵌套 tmux(本机 tmux 里再 SSH 到远端的 tmux)也要把前缀传给内层,bind C-a send-prefix 就是解决这个的。
图 09:用 | 和 - 分屏

图 05 说过 -h/-v 的命名反人类,解决办法是把分屏键直接绑成分割线形状的符号:
| |
助记逻辑:| 长得像竖着的分割线,切出左右两块;- 长得像横线,切出上下两块。从此不用记 -h 还是 -v。
图 10:给活动窗格的边框上色
三个 pane 里,光标所在的那个边框是红色,其余是暗灰色。一行配置:
| |
注意原文写于 2016 年,给的链接里是 pane-active-border-fg red 这种老写法——tmux 2.9(2019 年)把一大批 -fg / -bg / -attr 散选项合并成了 -style 键值形式,新配置请统一用 -style,老写法在新版本会直接报错。
图 11:活动窗格高亮、其余调暗
效果:左边光标所在 pane 是纯黑底、亮白字;右边分出去的 pane 整体灰扑扑的,一眼就知道焦点在哪(原文右边跑的是 Vim,它自身的暗色主题叠加上调暗效果、显得更灰)。复现图做成上下两行对照:上行是活动样式,下行是失焦调暗的样子(capture 拿不到渲染层的调暗处理,复现图用灰罩示意)。配置:
| |
两个冷知识:① window-style 以"窗口是否失焦"为开关——窗口失焦后它里面所有 pane 一起变灰,不是按 pane 逐个调;② setw 是 set-window-option 的缩写,窗口级选项用它,全局选项用 set -g。
图 12:用 H/J/K/L 调整窗格大小
2×2 四格布局,浮层显示刚按下的 H(同样是录屏软件的按键可视化)。把 Vim 的方向键肌肉记忆搬过来:
| |
步长 5 格一次,比默认的 1 格快得多。想连按就加 -r(如 bind -r H resize-pane -L 5),按住前缀键连续按 H 就能持续调整。
图 13:prefix r 热加载配置

改配置不用杀会话重开,绑一个快捷键:
| |
图里状态栏区域出现的绿色 “Reloaded!” 就是 display-message 的输出——tmux 会把这类消息临时渲染在状态栏区域,几秒后自动消失(复现图在无客户端连接的环境下生成,以同款绿色消息条呈现)。\; 是 tmux 配置里的命令分隔符,让一个按键按顺序执行两条命令。
图 14:TPM 插件管理器

最后一张动图演示 TPM(Tmux Plugin Manager)装插件的过程:配置里声明插件,按 prefix I(大写 i)安装。复现图跑的是 TPM 安装脚本的原始输出(Installing "tpm" → "tpm" download success → Installing "tmux-resurrect");原文插件已经装过,显示的是 Already installed 'resurrect'、TMUX environment reloaded 这类黄字提示——两者都是 TPM 自己的安装界面。
| |
TPM 要先手动克隆一次:git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm,之后 prefix I 装、prefix U 更新、prefix alt u 删。
第三部分:2026 年抄作业的注意事项
原文写于 tmux 2.x 时代,语法大体还能用,只有一类系统性变化要留意:tmux 2.9(2019 年)起,所有 -fg / -bg / -attr 散选项合并为 -style 键值形式。对照如下:
| 老写法(原文时代) | 现行写法(2.9+) |
|---|---|
pane-active-border-fg red | pane-active-border-style fg=red |
status-bg green | status-style bg=green |
window-status-current-bg white | window-status-current-style bg=white |
message-fg black | message-style fg=black |
把上面所有定制合在一起、转成现行语法,就是一份可以直接抄的 .tmux.conf:
| |
写完按 prefix r 热加载即可生效(TPM 首次使用要先 git clone,见上一节)。
结语
这篇 2016 年的教程至今仍是很好的 tmux 入门材料:概念(server / session / window / pane)讲得清楚,定制给的也都是高频刚需。真正会过时的是语法细节和图片里那个终端环境本身——字体、主题、按键可视化,这些恰恰是看图时最容易好奇、文章里却未必点破的东西,希望这次的逐图拆解补上了这一层。
原文链接:tmux for Local Development: A Deep Dive
图片来源声明:本文配图不是原文截图。原文站点几经改版,2016 年的原始动图已无法从线上取得(互联网档案馆也未见该版本存档),故全部 14 张图均为本机 tmux 3.4 逐条重跑原文命令/配置生成的复现图,画面顺序与原文一一对应,个别差异已在正文标注。复现脚本见仓库
tools/gen_tmux_teardown_figs.py,可自行重放。教程文字、思路与截图风格归原作者 Jeff Cole 及 Delicious Brains 所有。






