DECSACE —— 选择属性改写范围(`CSI Ps * x`)
切换 DECCARA / DECRARA 把矩形当作字面单元块(默认)还是从起点到终点的文本流。内容侧矩形操作(DECCRA / DECFRA / DECERA / DECSERA)不受影响。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\x1b[<Ps>*x\033[0*x / \033[1*x / \033[2*x\e[0*x / \e[1*x / \e[2*xESC [ Ps * x1b 5b 30 2a 78 / 1b 5b 31 2a 78 / 1b 5b 32 2a 78说明
DECSACE 是一个字节参数,决定「矩形」在 DECCARA($r)与 DECRARA($t)眼中是什么。内容侧的 —— DECCRA($v)、DECFRA($x)、DECERA($z)、DECSERA(${)—— 不论 DECSACE 如何始终按块语义(见 dec-rect-ops)。
参数
- Ps = 0(默认)或 Ps = 1 —— 块 / 矩形模式。坐标命名严格单元矩形的角。Pt;Pl 是左上,Pb;Pr 是右下;受影响单元构成字面 (Pb−Pt+1) × (Pr−Pl+1) 单元矩形。
- Ps = 2 —— 流模式。坐标按文本流顺序命名两个位置。Pt;Pl 是流起,Pb;Pr 是流止;受影响单元为起点至终点之间(含两端)按正常换行流的每一个单元。是「段落」高亮器 —— 对 (3,1) 至 (7,40) 之间所有散文加粗、不顾列边界。
查询:DECSACE 通过 DECRQM 在私有模式 ?92 上报(\x1b[?92$p 回 \x1b[?92;<Ps>$y,Ps 是当前范围 —— 2 流、其他块)。有些模拟器对默认情况回 1 而非 0。
持久性:值是终端状态的一部分 —— 被 DECRQTSR / DECSC 保存、被 DECRSTS / DECRC 还原。DECSTR(软重置)把 DECSACE 复位为块(Ps = 0);RIS(硬重置)同。
实际用法:块默认正是 TUI 与屏幕渲染器要的 —— 矩形属性改写就是一个矩形。流模式是*编辑器*要的 —— 对可能跨换行、不必保留列结构的选区做属性 —— VS Code 风格的「为这段散文加下划线」。模式有粘性,所以切到流、做矩形属性操作、再切回块。别留在流模式 —— 后续假定块语义的代码会画错。
覆盖度:xterm = 完整(基准)。Konsole + gnome-terminal + mlterm + WezTerm + Ghostty = 完整。iTerm2 = 部分(DECRQM ?92 正确回报,但流模式 DECRARA 在矩形跨越换行行时画错)。Kitty = 部分(模式被解析与保存,但 DECCARA / DECRARA 本身就部分 —— 见其条目)。Alacritty + Windows Terminal + cmd / ConPTY + Linux console + macOS Terminal = 静默(DECCARA / DECRARA 本身就静默,故 DECSACE 没有什么可切)。
规范出处: DEC VT510 RM (DECSACE) / xterm-ctlseqs (CSI Ps * x)
参数
| Ps = 0 or 1 | 块(矩形)模式 —— DECCARA / DECRARA 把坐标当作矩形角。默认。 |
| Ps = 2 | 流模式 —— DECCARA / DECRARA 把坐标当作文本流中的起 / 止位置。 |
示例
# Enter stream mode, bold a prose span from (3,1) to (7,40), restore block.\nprintf '\\033[2*x' # DECSACE = stream\nprintf '\\033[3;1;7;40;1$r' # DECCARA bold\nprintf '\\033[0*x' # DECSACE = block (cleanup)import sys\nsys.stdout.write('\\x1b[?92$p') # DECRQM probe — what's the current extent?\nsys.stdout.flush()\n# Reply on stdin: '\\x1b[?92;0$y' = block, ';2$y' = stream.// Always restore block mode before exiting a TUI subroutine.\ndefer fmt.Print(\"\\x1b[0*x\")\nfmt.Print(\"\\x1b[2*x\") // stream for the duration\n// ... rect-attr work ...// Highlight a wrap-aware selection: positions 12,5 -> 18,40 as one stream.\nprocess.stdout.write('\\x1b[2*x\\x1b[12;5;18;40;7$r\\x1b[0*x');/* Toggle stream mode briefly; assume xterm or konsole. */\nprintf(\"\\x1b[2*x\");\nprintf(\"\\x1b[%d;%d;%d;%d;1;4$r\", t, l, b, r); /* bold + underline */\nprintf(\"\\x1b[0*x\");终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 不支持 | 不支持 | 部分 | 不支持 | 不支持 | 部分 | 不支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |