跳到主要内容
ansicode
终端

tmux —— ANSI 转义码支持情况

tmux 是一个终端复用器 —— 一个介于 shell 与真实终端模拟器之间的中间层,让单个窗口承载多个独立的窗格,并让分离(detach)的会话在窗口关闭后继续存活。最早由 Nicholas Marriott 于 2007 年发布,作为 BSD 许可证替代 GNU screen 的方案。在 2026 年,每个主流 Linux 发行版、Homebrew 以及 FreeBSD 基础系统都预装了 tmux。

对于 ANSI 转义码而言,复用器的位置很关键:tmux 自己拥有一个终端模拟器(内层,你的程序与之对话),并把重新编码后的序列流向上转发给负责实际渲染窗口的外层终端。大多数转义可以干净地穿透(每种 SGR 色彩、光标移动、擦除);但有一些会被 tmux 自己拦截 —— 备用屏幕、鼠标、焦点事件、OSC 8 超链接;还有少数永远到不了外层(Kitty 图形协议与 tmux 的字符网格模型互相冲突,进入 tmux 后会出现损坏)。所有人最先踩到的第 1 号坑是真彩色:tmux 要求 ~/.tmux.conf 同时写入 set -g default-terminal "tmux-256color"set -ga terminal-overrides ",*256col*:Tc"(或 ,*:RGB),才会向上转发 24 位 SGR;缺少 override 时,\x1b[38;2;255;0;0m 会被静默量化到最接近的 256 色调色板索引。

最近更新

特性支持情况

该终端在站点统一矩阵跟踪的 15 个特性上的表现。点击任意特性名可查看其在全部终端上的完整支持情况。

  • 8 种基础色(30–37 / 40–47)SGR 30–37 前景,40–47 背景。
    支持
  • 高亮(aixterm)色(90–97 / 100–107)aixterm SGR 扩展。
    支持
  • 256 色调色板(38;5;n / 48;5;n)xterm 256 色扩展。
    支持
  • 24 位真彩色(38;2;r;g;b)1670 万直接 RGB。设置 $COLORTERM=truecolor。
    部分
  • 斜体(SGR 3)斜体文本属性。
    支持
  • 扩展下划线(4:1–4:5)波浪/点/虚下划线样式。
    部分
  • 删除线(SGR 9)文本中央的水平线。
    支持
  • OSC 8 超链接内联可点击 URI。
    部分
  • 备用屏幕(?1049h)全屏应用缓冲区。
    支持
  • 鼠标跟踪(SGR ?1006)鼠标点击/拖拽事件。
    部分
  • 括号粘贴(?2004)粘贴文本被 ESC[200~/ESC[201~ 包裹。
    支持
  • 焦点事件(?1004)获得焦点时 ESC[I,失去时 ESC[O。
    部分
  • Sixel 图形DEC sixel 内联位图。
    部分
  • Kitty 图形协议PNG/RGB 内联图像和动画。
    不支持
  • 同步输出(?2026)原子化帧更新,避免撕裂。
    部分

在此终端可用的序列

该终端能完整处理的转义序列对应的权威参考页。每条均链接到完整页面,含字节形式、规范出处与多语言示例。

细节与版本说明

在生产中使用某序列前应知晓的、该终端特有的注意事项。

真彩色需要显式 terminal-overrides —— 第一号摩擦点
tmux 是否向上转发 24 位 SGR,取决于外层终端的 terminfo 条目是否声明了 Tc(或 RGB)能力。大多数发行版默认的 xterm-256color 并未声明 —— 因此 tmux 会把 \x1b[38;2;…m 量化到最接近的 256 色索引。修复办法是在 ~/.tmux.conf 里加两行:set -g default-terminal "tmux-256color"(设置复用器*内部*的 $TERM,与外层 $TERM 相互独立)和 set -ga terminal-overrides ",*256col*:Tc"(为所有匹配 *256col* 的 terminfo 条目追加 Tc 能力)。重新加载(tmux source ~/.tmux.conf)后,用 tmux info | grep -E '(Tc|RGB)' 验证两者都为 true。tmux ≥ 2.7 推荐用更新的 ,*:RGB 写法 —— RGB 是标准化能力,Tc 只是 tmux 的私有扩展。
OSC 8 超链接直通 —— 仅自 tmux 3.4(2024 年 4 月)起
tmux 3.4 是终于把 \x1b]8;;https://…\x1b\\ 重新发往外层终端的版本。更早版本会去除 OSC 字节、只保留可见文本 —— 在 tmux 外可点击的链接进入 tmux 内就降级为普通文字。可用 tmux -V 验证版本(需要 ≥ 3.4),并在 attach 状态下试 echo -e '\x1b]8;;https://example.com\x1b\\link\x1b]8;;\x1b\\'。若外层终端也支持 OSC 8(iTerm2、kitty、Ghostty、GNOME Terminal、Konsole、WezTerm —— 见上方矩阵),链接可点击;否则仍只能看到可见文本。tmux 3.0–3.3 需要 set -g allow-passthrough on 才会尝试转发,即便如此仍会专门剥掉 OSC 8。
备用屏幕、鼠标、焦点事件 —— 由 tmux 拥有,而非外层终端
在 tmux 内,备用屏幕切换(\x1b[?1049h / ?1049l)翻转的是 tmux 自己的缓冲,而不是外层终端 —— 这正是 vim/htop/less 能被限制在单个 pane 内的原因。鼠标跟踪序列(\x1b[?1000h?1006h)会被拦截:在 tmux 内用 set -g mouse on 启用,之后 tmux 把点击坐标转交给聚焦 pane 的程序(前提是同时设置了 set -g mode-mouse on)。焦点事件(\x1b[?1004h)默认关闭 —— 用 set -g focus-events on 开启,neovim 等编辑器即可对失去焦点作出反应。这里的关键模式是:应用程序仍按以往发送 DEC 私有模式序列;tmux 只是中间的接收方。
Kitty 图形协议在 tmux 下无法正常工作
tmux 的字符网格模型假设每个输出字节只更新一个单元格;Kitty 图形协议(以及 Ghostty 的兼容实现)发送的是包含 base64 PNG/RGB 数据的多千字节 APC 序列 —— 这些根本不适配网格。著名的 "tmux destroys kitty graphics" 问题(kovidgoyal/kitty#3027)记录了上游讨论;在 2026 年的实务回答是:不要在 tmux 内渲染 Kitty 图形,直接用裸终端。tmux 3.3+ 提供了实验性的 allow-passthrough on,允许 APC 字节穿过,但 pane 的重绘循环仍会破坏图像。如果一定要让内联图像穿过 tmux,请优先选 sixel —— 在 tmux 3.4+ 加上 allow-passthrough on 后可往返(仍有视觉怪癖,但数据不会丢失)。
tmux 内部 $TERMtmux-256color,而非外层终端的值
tmux 在 pane 内启动 shell 时,会把 $TERM 设为 tmux-256color(或 default-terminal 配置的任意值)。外层终端的 $TERM —— xterm-256coloriterm2 等 —— 对内层程序不可见。这对基于 terminfo 的特性检测很关键:tput colors 在 tmux 内即使外层终端支持真彩色也只会报告 256;程序应当信任 $COLORTERM=truecolor(tmux *会* 从外层环境继承转发它),或者用 tmux info | grep RGB 程序化检测。早期 tmux 把 $TERM 设为 screen-256color —— 这是复用器规范的 terminfo 条目,但缺少斜体等少数能力 —— 建议升级到 tmux-256color(ncurses ≥ 6.0 自带),以减少意外。
会消失的序列:括号粘贴、DA1/DA2 响应、调色板查询
tmux 在向下层 pane 转发前,会重新编码来自外层终端的输入流 —— 大多数字节序列能通过,但少数会被 tmux 自己应答或吸收。Device Attributes 响应(CSI c 查询后的 \x1b[?1;2c)来自 tmux,而非外层终端 —— 通过 DA1 探测 sixel 支持的程序看到的是 tmux 的能力,而非底层的能力。调色板查询(OSC 4 ; n ; ? \x07)同样由 tmux 用自己的调色板(通常是 256 色 xterm 调色板)应答,而非外层终端的主题调色板。括号粘贴输入包装(\x1b[200~ … \x1b[201~)会被转发 —— tmux 2.6+ 还原生实现了该协议,因此即使 pane 内程序未开启该模式,粘贴也能正确工作。

参考资料

其他已有专页的终端