DA — 设备属性查询(CSI c / CSI > c)
询问终端的 VT 类型 —— 主查询(CSI c)返回支持特性,副查询(CSI > c)返回型号与固件。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\\x1b[
\x1b[c (primary DA) \x1b[>c (secondary DA)\\033[
\033[c / \033[>c\\e[
\e[c / \e[>cESC [
ESC [ c / ESC [ > chex
1b 5b 63 / 1b 5b 3e 63说明
Device Attributes —— 程序发送的请求/回复对,终端通过输入流应答。主 DA(\x1b[c,亦可写 \x1b[0c)—— 终端回复 \x1b[?64;...c,列出 VT 等级和可选特性(132 列模式、sixel、ReGIS、用户定义键等)。副 DA(\x1b[>c,亦可写 \x1b[>0c)—— 终端回复 \x1b[>Pp;Pv;Pcc,Pp 为型号(0=VT100,1=VT220,41=VT420,61=xterm 风格,65=VT525 等),Pv 为固件版本,Pcc 为 ROM 序列号(通常 0)。程序常在启动时通过 DA 做特性探测 —— neovim 的 t_Co 自动检测、tmux 的标题能力探测、mintty 的 xterm 兼容性检查均依赖它。
规范出处: ECMA-48 §8.3.24 (DA) / xterm-ctlseqs
示例
# Send primary DA and read the reply (raw mode):\nstty -echo raw min 0 time 5\nprintf '\033[c'; IFS= read -r -t 1 -d c REPLY; stty sane\necho "DA reply: $REPLY c"import sys, termios, tty, select\nfd = sys.stdin.fileno(); old = termios.tcgetattr(fd); tty.setraw(fd)\ntry:\n sys.stdout.write('\x1b[c'); sys.stdout.flush()\n r, _, _ = select.select([fd], [], [], 1.0)\n print(repr(sys.stdin.read(64)) if r else 'no reply')\nfinally:\n termios.tcsetattr(fd, termios.TCSADRAIN, old)fmt.Print("\x1b[c") // request; read reply via os.Stdin in raw modeprocess.stdout.write('\x1b[c') // reply arrives on process.stdinprintf("\x1b[c"); fflush(stdout); /* read reply from stdin */在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- tmux attach-time feature probetmux ≥ 3.2 每次客户端 attach 时发 DA1(`\x1b[c`)探测终端能力 —— 应答的参数列表驱动 `default-terminal` 选择(`tmux-256color` 对 `tmux-direct`)、`allow-passthrough` 默认值,以及面板内公告的 bracketed-paste 可用性
- ncurses initialization (`initscr()`)ncurses `initscr()` 与 `newterm()` 在终端状态探测阶段发 DA1,先于读取用户 `$TERM` terminfo 条目 —— 应答与 terminfo `da` 布尔对比,检测「在无真 DA 的 VT 上跑 ncurses」(现代系统罕见)
- neovim `:checkhealth nvim` terminal sectionneovim 0.9+ 把 DA1 + DA2 + DA3 + XTVERSION 作为 `term://` 特性检测链 —— `:checkhealth nvim` 将解析后的 DA1 应答报告为 `Terminal: DEC VT220 (62)` 或 `Terminal: VT525 (65)`,让用户看到终端公告值
- kitty `kitten query-terminal`kitty 自带的 `kitten query-terminal` 把 DA1 + DA2 + DA3 + XTGETTCAP + DECRQSS 作为一次性的终端能力转储运行 —— 输出格式镜像 xterm 的 `XTQUERY` 调试日志,集成商用于移植插件时确认特性对齐
- wezterm `wezterm cli list-clients` capability columnwezterm CLI 通过解析客户端连接握手时缓存的 DA1 应答填充 `client-features` 列 —— 运维读表可识别 DA1 报 `?1;2`(带高级视频的 VT100)的面板,与 `?64;1;9;15;22;29`(VT420)的差异
常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
- 怎样检测当前所在的终端类型?
- 发
\x1b[c(Primary Device Attributes)然后从 stdin 读响应——终端会回\x1b[?<等级>;<功能>;…c标识其仿真级别(如\x1b[?64;1;6c表 VT520 级、支持 132 列与选择擦除)。要更细信息,发\x1b[>c(Secondary DA)取终端类型 + 固件版本;现代终端也接 XTVERSION(\x1b[>q),返回人类可读的名称 + 版本字符串。 - 如果终端不回应该怎么办?
- 设超时——50-100ms 是 DA 查询的标准窗口,超过就当终端没实现该响应。可能用户在没接终端的串口线上,或在 stdin 是
/dev/null的日志管道里。退回到$TERM/$COLORTERM环境变量嗅探是常用恢复手段。
终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 支持 | 支持 | 支持 | 支持 | 部分 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |