跳到主要内容
ansicode

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[>c
ESC [ESC [ c / ESC [ > c
hex1b 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

示例

bash
# 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"
python
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)
go
fmt.Print("\x1b[c")   // request; read reply via os.Stdin in raw mode
javascript
process.stdout.write('\x1b[c')   // reply arrives on process.stdin
c
printf("\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
支持

相关序列

在家族食谱中

CSI 食谱 · 4. 查询 —— DA、DA2、DSR、DECRQM