DECCRA / DECFRA / DECERA / DECSERA —— 矩形区域的复制 / 填充 / 擦除 / 选择性擦除
DEC 矩形操作族里改字符内容的四件套 —— 复制一块、用某字模填、擦成空格、只擦未保护单元。与 DECCARA / DECRARA(改属性侧)以及 DECSACE(块 vs 流切换)配套。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\x1b[<Pts>;<Pls>;<Pbs>;<Prs>;<Pps>;<Ptd>;<Pld>;<Ppd>$v DECCRA\n\x1b[<Pch>;<Pt>;<Pl>;<Pb>;<Pr>$x DECFRA\n\x1b[<Pt>;<Pl>;<Pb>;<Pr>$z DECERA\n\x1b[<Pt>;<Pl>;<Pb>;<Pr>${ DECSERA\033[1;1;10;40;1;15;5;1$v / \033[42;3;5;10;40$x / \033[3;5;10;40$z / \033[3;5;10;40${\e[1;1;10;40;1;15;5;1$v / \e[42;3;5;10;40$x / \e[3;5;10;40$z / \e[3;5;10;40${ESC [ Pts;Pls;Pbs;Prs;Pps;Ptd;Pld;Ppd $ v / $ x / $ z / $ {1b 5b … 24 76 / 1b 5b … 24 78 / 1b 5b … 24 7a / 1b 5b … 24 7b说明
DEC 矩形族中共享 `$` 中间字节、*会*改单元内字符的四件套 —— DECCARA / DECRARA 只改属性。每个矩形用 1 起算闭区间坐标,遵循当前滚动区与原点模式。「块 vs 流」的矩形语义由 **DECSACE**(`\x1b[Ps*x`)选择。 **DECCRA** —— *矩形区域复制*,`$v`。八参:源矩形(`Pts;Pls;Pbs;Prs;Pps`)+ 目的左上角(`Ptd;Pld;Ppd`)。`Pps`/`Ppd` 是页号(在所有现代单页模拟器上为 1 —— DEC VT525 有多页内存)。是*逐单元*复制:字符与每单元属性一起搬;落到目的可见区外的部分被裁剪,不换行。源 / 目的重叠时正确处理(终端通常借内部 scratch 缓冲,故自上向下平移安全)。 **DECFRA** —— *矩形区域填充*,`$x`。五参:字模码(`Pch`,7 位十进制码 32–126;UTF-8 感知模拟器上是 16 位码)+ `Pt;Pl;Pb;Pr`。每个单元被该字模覆盖,并取得*当前* SGR 笔的属性。常见用途:用单字符(DECFRA `Pch=32` 是按矩形版的 `clear`)清掉一个内置框、在 UTF-8 模拟器上用 `█`(U+2588)画实心框、为 scratch 窗格预填。 **DECERA** —— *矩形区域擦除*,`$z`。四参:矩形。等价于 DECFRA `Pch=32`(空格)*且*单元属性回到默认 —— 留下*完全清空*的矩形,而非「带当前笔的空格」。重置包括 SGR 层、前后景色、选择性擦除保护位。 **DECSERA** —— *选择性擦除矩形区域*,`${`。四参:矩形。同 DECERA 但*尊重* **DECSCA 保护**位:被 `\x1b[1"q` 标为保护的单元保留;其余清成空格 + 默认属性。是 `decsed-decsel`(选择性 ED / EL)的矩形版 —— 表单模板上清字段但留标签的唯一办法。 **流模式(DECSACE)**。当 `\x1b[2*x` 生效时,`Pt;Pl` 与 `Pb;Pr` 解释为流起止位置而非矩形角 —— 受影响单元为两位置间按正常文本流(含换行)依次每单元。流模式在**所有**实际模拟器上**仅**通过 DECCARA / DECRARA 接通;以上四个内容操作无论 DECSACE 如何都按块语义。这是 xterm 家族相对 *DEC VT510* 的偏离 —— 若你要依赖此行为,用 DECRQM `?92` 探测。 **覆盖度**:**xterm** = 四个都完整。**Konsole** = 完整。**WezTerm** + **Ghostty** = DECFRA + DECERA 完整,DECCRA + DECSERA 部分。**gnome-terminal** + **mlterm** = 完整。**iTerm2** = 部分(不支持 DECSERA,其余尊重当前 SGR 笔而非重置)。**Kitty** = DECERA + DECFRA 完整,DECCRA + DECSERA 静默。**Alacritty** + **Windows Terminal** + **cmd / ConPTY** + **Linux console** + **macOS Terminal** = 静默。要依赖时用 `xtversion` + 对 `$z` 做 DECRQSS 探测先确认。
规范出处: DEC VT510 RM (DECCRA / DECFRA / DECERA / DECSERA) / xterm-ctlseqs (CSI ... $ v / x / z / {)
参数
| Pts;Pls;Pbs;Prs;Pps (DECCRA) | 源矩形上 / 左 / 下 / 右 / 页(1 起算、闭区间)。 |
| Ptd;Pld;Ppd (DECCRA) | 目的左上角行 / 列 / 页。 |
| Pch (DECFRA) | 用于填充的字模码 —— 经典 DEC 上 32–126(7 位 ASCII);多数现代模拟器接受到 U+FFFF。 |
| Pt;Pl;Pb;Pr (DECFRA / DECERA / DECSERA) | 矩形上行 / 左列 / 下行 / 右列,1 起算闭区间。 |
示例
# Copy rows 1-5 cols 1-40 to rows 20-24 cols 41-80.\nprintf '\\033[1;1;5;40;1;20;41;1$v'\n# Fill a status bar with U+2588 (decimal 9608) — needs UTF-8 emulator.\nprintf '\\033[9608;24;1;24;80$x'\n# Erase rows 5-10 cols 5-75 (clear an inset region).\nprintf '\\033[5;5;10;75$z'import sys\n# Form-field clear: keep DECSCA-protected labels, clear data cells.\nsys.stdout.write('\\x1b[3;10;20;70${') # DECSERA\nsys.stdout.flush()// Pre-fill a help pane with '·' (decimal 183) before drawing content.\nfmt.Print(\"\\x1b[183;1;1;24;80$x\")// 'Reset the canvas inset' — DECERA wipes both glyph + attrs to default.\nprocess.stdout.write('\\x1b[2;2;23;79$z');/* Duplicate a logo block from rows 1-6 cols 1-30 to a side panel. */\nprintf(\"\\x1b[1;1;6;30;1;1;51;1$v\");终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 不支持 | 不支持 | 部分 | 不支持 | 不支持 | 部分 | 不支持 | 部分 | 部分 | 支持 | 支持 | 不支持 | 不支持 |