跳到主要内容
ansicode

DECSACE —— 选择属性改写范围(`CSI Ps * x`)

切换 DECCARA / DECRARA 把矩形当作字面单元块(默认)还是从起点到终点的文本流。内容侧矩形操作(DECCRA / DECFRA / DECERA / DECSERA)不受影响。

字节形式

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

\\x1b[\x1b[<Ps>*x
\\033[\033[0*x / \033[1*x / \033[2*x
\\e[\e[0*x / \e[1*x / \e[2*x
ESC [ESC [ Ps * x
hex1b 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>$yPs 是当前范围 —— 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 把坐标当作文本流中的起 / 止位置。

示例

bash
# 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)
python
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.
go
// 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 ...
javascript
// 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');
c
/* 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
支持

相关序列