跳到主要内容
ansicode

DECREQTPARM / DECREPTPARM —— 请求并报告终端参数(`CSI Ps x`)

VT100 时代的遗留探测 —— 让终端报告其串口参数(校验、位宽、波特率、时钟倍数、标志位)。比 DA / DA2 / XTVERSION 都早;现今几乎不该再用,但 xterm 与多数现代模拟器仍以合成默认值作答。

字节形式

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

\\x1b[\x1b[<Ps>x
\\033[\033[1x
\\e[\e[1x
ESC [ESC [ Ps x
hex1b 5b ... 78

说明

DECREQTPARM —— 请求终端参数 —— `CSI Ps x`,`Ps` 选择「主动 vs 被动」语义。原本绑定到 VT100 物理串口:主机可问「你的波特 / 校验 / 位宽是多少」,终端在同条串线上回应当前设置。 **请求**: - `Ps = 0` —— 终端此后*可能*主动发 DECREPTPARM 响应(实际过时;几乎无模拟器实现 —— 这是主机管理多点串线设置的遗物)。 - `Ps = 1` —— 立刻请求一次被动响应。 **回复(DECREPTPARM)** —— `\x1b[<sol>;<par>;<nbits>;<xspeed>;<rspeed>;<clkmul>;<flags>x` - `sol` = `2` 主动,`3` 被动(与请求匹配)。 - `par` = 校验 —— `1` 无、`4` 奇、`5` 偶。 - `nbits` = 数据位 —— `1` 八位,`2` 七位。 - `xspeed` = 发送速率编码(如 `16` = 9600、`24` = 38400、`88` = 多数模拟器合成的「快」)。 - `rspeed` = 接收速率编码(通常与 `xspeed` 相同)。 - `clkmul` = 时钟倍数(真 VT100 恒为 `1`;现代模拟器回 `1`)。 - `flags` = STP / SET-UP / TIME 位字段(现代模拟器恒为 `0`)。 **现代模拟器表现**: - **xterm**:完整回复且默认合理 —— 视构建而定多为 `\x1b[3;1;1;112;112;1;0x` 或 `\x1b[3;1;1;88;88;1;0x`。速率编码合成,无实际意义。 - **kitty**、**wezterm**、**ghostty**、**iTerm2**、**alacritty**、**Konsole**:均「最小实现」以免挂死遗留探测 —— 一般回 `\x1b[3;1;1;112;112;1;0x` 或类似。 - **gnome-terminal**:同样合成。 - **Windows Terminal**:1.18+ 构建回;早期构建静默。 - **macOS Terminal**:静默 —— 不回。探测挂到超时。 - **cmd.exe / ConPTY**:静默。 - **Linux console**(`vt`):多数内核上回 `\x1b[3;1;1;112;112;1;0x`。 **2026 年你真要用吗**?几乎不要。回复除了「终端活着且懂 ECMA-48」之外提供零信息,而 DA1(`\x1b[c` —— 见 `csi-da`)已经能更干净地答出型号 ID。若你在老代码里看到 DECREQTPARM,几乎可以肯定是 VT100 时代串线设置代码的遗留。请替换为: - `csi-da`(DA1,`\x1b[c`)回答「这是 VT 类终端吗 / 哪个型号」。 - `csi-da2-decoder`(DA2,`\x1b[>c`)回答「模拟器类 + 固件版本」。 - `xtversion`(`\x1b[>0q`)回答「具体模拟器名 + 版本」(xterm 家族扩展)。 **若必须用**:发 `\x1b[1x`,从 stdin 读匹配 `\x1b\[3;\d+;\d+;\d+;\d+;\d+;\d+x` 的回复。**务必加 100 ms 超时** —— 否则 macOS Terminal 用户会让你卡死。别把 `xspeed`/`rspeed` 当真波特率;模拟器只发常量。唯一偶尔携带信号的字段是 `par`(校验),且只在串口直连模拟器(gtkterm、picocom —— 均不在我们 12 终端支持表内)上有意义。

规范出处: DEC VT100 User Guide §4 (DECREQTPARM / DECREPTPARM) / xterm-ctlseqs (CSI Ps x)

参数

Ps0 = 允许主动发送 DECREPTPARM(几乎所有实现都忽略)。1 = 立即请求一次被动 DECREPTPARM 回复。

示例

bash
# Solicited probe — read reply non-blocking with 100ms timeout.\nprintf '\\033[1x'\nIFS= read -rs -d x -t 0.1 reply </dev/tty 2>/dev/null\necho \"DECREPTPARM: ${reply#$'\\033'}x\"   # expect \\x1b[3;1;1;<spd>;<spd>;1;0x
python
import sys, re\nsys.stdout.write('\\x1b[1x'); sys.stdout.flush()   # DECREQTPARM solicited\n# ... terminal-aware read of reply (cbreak + select + timeout) ...\n# Match: \\x1b[(\\d+);(\\d+);(\\d+);(\\d+);(\\d+);(\\d+);(\\d+)x\n# Fields: sol par nbits xspeed rspeed clkmul flags
go
// DECREQTPARM — expect \"\\x1b[3;...x\" reply within 100ms or fall back to DA1.\nfmt.Print(\"\\x1b[1x\")
javascript
// Node: probe + parse + fallback.\nprocess.stdout.write('\\x1b[1x');\n// On stdin 'data', match /\\x1b\\[3;(\\d+);(\\d+);(\\d+);(\\d+);(\\d+);(\\d+)x/\n// — fields are mostly synthetic on modern emulators; prefer DA1 + XTVERSION.
c
/* Fire-and-forget DECREQTPARM; most modern emulators answer with constants. */\nprintf(\"\\x1b[1x\"); fflush(stdout);\n/* Parse reply (cbreak terminal): sscanf returned buf,\n *   \"\\x1b[%d;%d;%d;%d;%d;%d;%dx\",\n *   &sol, &par, &nbits, &xspd, &rspd, &clkmul, &flags); */

终端支持

xterm
支持
Linux console (fbcon)
支持
macOS Terminal.app
不支持
iTerm2
支持
Windows Terminal
部分
cmd.exe / ConPTY
不支持
kitty
支持
alacritty
支持
WezTerm
支持
Ghostty
支持
GNOME Terminal
支持
Konsole
支持
tmux
不支持
GNU screen
不支持

相关序列