XTVERSION — 上报终端名称与版本(CSI > Pp q)
向终端询问可读的名称 + 版本字符串 —— 替代 DECDA 用于功能检测的现代方案,已被 Helix、Zellij、Neovim 等采用。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\x1b[>0q (query) reply: \x1bP>|<name> <version>\x1b\\\033[>0q\e[>0qESC [ > Pp q → DCS > | <text> ST1b 5b 3e ... 71说明
以 xterm 扩展形式发送 Tertiary Device Attribute(TDA)查询。> 前缀把末字节 q 从 DECSCA(字符保护)切换为 XTVERSION;Pp 保留(恒发 0),仅供前向兼容。终端以 DCS 包裹的字符串回复,标识自身:DCS > | <名称> <空格> <版本> ST —— 例如 \x1bP>|XTerm(370)\x1b\\、\x1bP>|kitty 0.32.2\x1b\\、\x1bP>|WezTerm 20240203\x1b\\、\x1bP>|ghostty 1.0.0\x1b\\。终止符是 ST(\x1b\\),偶有遗留实现用 BEL(\x07)。此序列实际上已取代 DECDA(\x1b[c)作为功能检测手段 —— DECDA 的终端 ID 编号(61 / 62 / 63 = VT100 / 220 / 320)早在 1990 年代就耗尽,与现代特性已脱钩。所有依据 kitty / WezTerm / iTerm2 分支启用 kitty graphics、OSC 1337 或 sixel 的 TUI 都把 XTVERSION 作为承重查询。往返很快(Unix 终端同步;ConPTY 上轮询非阻塞也可)。若约 200 ms 内未收到回复,可视为原始终端不支持 XTVERSION。
规范出处: xterm-ctlseqs (Tertiary DA / XTVERSION)
参数
| Pp | 保留。恒发 0。任意值的存在把 XTVERSION 与同样合法的 CSI > q(无参)区分开。 |
示例
# Print whichever terminal name comes back, then disambiguate:\nprintf '\033[>0q'\nread -rd '\\' reply\necho "$reply" # e.g. \x1bP>|kitty 0.32.2import sys, termios, tty, select\nsys.stdout.write('\x1b[>0q'); sys.stdout.flush()\n# Read DCS-framed reply: starts with \x1bP and ends with \x1b\\fmt.Print("\x1b[>0q")\n// scan stdin for DCS > | ... ST framing\n// branch: strings.HasPrefix(name, "kitty") → enable kitty graphicsprocess.stdout.write('\x1b[>0q')\n// process.stdin gets back a DCS-framed text like \x1bP>|WezTerm 20240203\x1b\\fputs("\x1b[>0q", stdout); fflush(stdout);\n/* read DCS payload, switch on substring 'kitty' / 'xterm' / 'WezTerm' */在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- neovim `:checkhealth provider.term`checkhealth 用 `\x1b[>q` 查询 kitty / iTerm2 / wezterm / ghostty 终端版本,按答案有条件地启用波浪下划线、OSC 52 剪贴板、Kitty 图形
- alacritty, kitty, iTerm2, Windows Terminal CI matrices测试套件通过解析 DA3 / XTVERSION 应答来钉住终端版本 —— 某个 iTerm2 构建的回归不会污染整个测试网格
- nix-shell, devshell terminal-feature probes提供可复现环境的 shell 在启动时查询 XTVERSION 以启用 / 禁用按终端的 hack(如 iTerm2 专属的 OSC 1337 内联图片显示)
- vim-plug, lazy.nvim plugin gating依赖终端专属特性(Kitty 图形、sixel、焦点事件)的插件读 XTVERSION,在缺该特性的终端跳过加载而非运行时崩溃
- tmux / screen passthrough detection scripts复用器包装脚本在启用 `allow-passthrough` 让 OSC 52 / sixel 透传前,先通过外层终端跑 XTVERSION —— 限定在已知良好的底层终端可避免在裸 xterm 上出现透传乱码
常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
- XTVERSION
\x1b[>q与 DA3\x1b[=c有什么区别? - 两者都问「你是谁」 —— 应答形状与受众不同。XTVERSION(xterm 扩展,亦支持 kitty / WezTerm / iTerm2 ≥ 3.5 / Alacritty / Windows Terminal ≥ 1.21)返回可读字符串,如
\x1bP>|XTerm(389)\x1b\\或\x1bP>|kitty 0.34.0\x1b\\—— 正则易解析。DA3(三级设备属性)返回固定格式 DCS,含 4 字节十六进制单元 ID(xterm 应答\x1bP!|7E565445\x1b\\=~VTE) —— 面向机器标识,难以映射到可读名。基于终端名做特性门控用 XTVERSION;DA3 仅在构建需按稳定 id 区分底层终端的复用器时偶尔需要。 - 向不支持 XTVERSION 的终端发送它安全吗?
- 基本安全 ——
\x1b[>q是以q结尾的带参 CSI,不识别它的终端按 ECMA-48 规则静默丢弃未知终止字节。两个边界:(1) 极老的 VT100 模拟器会把\x1b[>q当 DECLL(Load LEDs)带参,但实际 LED 是虚拟的,副作用不可见。(2) 应答是可变长 DCS —— 始终用 100–200 ms 超时读取,否则沉默终端会卡住检测循环。标准模式:发送后读到\x1b\\(ST)为止并设超时,超时回退到基于$TERM的硬编码表。
终端支持
- xterm
- 支持
- Linux console (fbcon)
- 不支持
- macOS Terminal.app
- 不支持
- iTerm2
- 支持
- Windows Terminal
- 支持
- cmd.exe / ConPTY
- 不支持
- kitty
- 支持
- alacritty
- 不支持
- WezTerm
- 支持
- Ghostty
- 支持
- GNOME Terminal
- 部分
- Konsole
- 支持
- tmux
- 支持
- GNU screen
- 支持
| xterm | Linux console (fbcon) | macOS Terminal.app | iTerm2 | Windows Terminal | cmd.exe / ConPTY | kitty | alacritty | WezTerm | Ghostty | GNOME Terminal | Konsole | tmux | GNU screen |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 不支持 | 不支持 | 支持 | 支持 | 不支持 | 支持 | 不支持 | 支持 | 支持 | 部分 | 支持 | 支持 | 支持 |