跳到主要内容
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 内部 `$TERM` 为 `tmux-256color`,而非外层终端的值
tmux 在 pane 内启动 shell 时,会把 `$TERM` 设为 `tmux-256color`(或 `default-terminal` 配置的任意值)。外层终端的 `$TERM` —— `xterm-256color`、`iterm2` 等 —— 对内层程序不可见。这对基于 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 内程序未开启该模式,粘贴也能正确工作。

参考资料

其他已有专页的终端