跳到主要内容
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 xPs 选择「主动 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。速率编码合成,无实际意义。 - kittyweztermghosttyiTerm2alacrittyKonsole:均「最小实现」以免挂死遗留探测 —— 一般回 \x1b[3;1;1;112;112;1;0x 或类似。 - gnome-terminal:同样合成。 - Windows Terminal:1.18+ 构建回;早期构建静默。 - macOS Terminal:静默 —— 不回。探测挂到超时。 - cmd.exe / ConPTY:静默。 - Linux consolevt):多数内核上回 \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
支持

相关序列