跳到主要内容
ansicode

XTVERSION — 上报终端名称与版本(CSI > Pp q)

向终端询问可读的名称 + 版本字符串 —— 替代 DECDA 用于功能检测的现代方案,已被 Helix、Zellij、Neovim 等采用。

字节形式

涵盖所有常见的字符串字面量写法,方便正反查找。

\\x1b[\x1b[>0q (query) reply: \x1bP>|<name> <version>\x1b\\
\\033[\033[>0q
\\e[\e[>0q
ESC [ESC [ > Pp q → DCS > | <text> ST
hex1b 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(无参)区分开。

示例

bash
# Print whichever terminal name comes back, then disambiguate:\nprintf '\033[>0q'\nread -rd '\\' reply\necho "$reply"   # e.g. \x1bP>|kitty 0.32.2
python
import sys, termios, tty, select\nsys.stdout.write('\x1b[>0q'); sys.stdout.flush()\n# Read DCS-framed reply: starts with \x1bP and ends with \x1b\\
go
fmt.Print("\x1b[>0q")\n// scan stdin for DCS > | ... ST framing\n// branch: strings.HasPrefix(name, "kitty") → enable kitty graphics
javascript
process.stdout.write('\x1b[>0q')\n// process.stdin gets back a DCS-framed text like \x1bP>|WezTerm 20240203\x1b\\
c
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
支持

相关序列