DSR — 设备状态报告(CSI 5n / CSI 6n)
查询终端状态(5n)或当前光标位置(6n)—— TUI 用以测量终端大小的反向通道。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\\x1b[
\x1b[5n (status request) \x1b[6n (cursor pos request)\\033[
\033[5n / \033[6n\\e[
\e[5n / \e[6nESC [
ESC [ Ps nhex
1b 5b <Ps> 6e说明
Device Status Report。程序发出请求,终端在 stdin 上回复。**`\x1b[5n`** —— 「你还好吗?」。回复:`\x1b[0n`(就绪)或 `\x1b[3n`(异常)。常作为启用奇特模式后的存活检查。**`\x1b[6n`**(又名 CPR,Cursor Position Report)—— 「光标在哪?」。回复:`\x1b[<row>;<col>R`。在没有 TIOCGWINSZ 的情况下测算终端大小的经典套路:把光标推到屏幕末端(`\x1b[9999;9999H`),DSR-6n,解析回复,再还原。现代程序首选 `ioctl(TIOCGWINSZ)` + `SIGWINCH` 监听 resize,但缺少该 ioctl 的场景(原始串口、某些 CI 环境)下,DSR-6n 仍是唯一可移植方案。xterm 扩展:`\x1b[?6n` 返回受 DECOM(origin mode)约束的光标位置。
规范出处: ECMA-48 §8.3.35 (DSR) / xterm-ctlseqs
示例
# Discover terminal size without TIOCGWINSZ:\nstty -echo raw min 0 time 5\nprintf '\033[s\033[9999;9999H\033[6n\033[u'\nIFS=';' read -r -d R esc_row col; stty sane\necho "rows=${esc_row#*[} cols=$col"import sys; sys.stdout.write('\x1b[6n') # reply arrives on stdin in raw modefmt.Print("\x1b[6n")process.stdout.write('\x1b[6n')printf("\x1b[6n"); fflush(stdout); /* parse <row>;<col>R from stdin */终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 |