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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 不支持 | 不支持 | 部分 | 不支持 | 不支持 | 部分 | 不支持 | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 |