跳到主要内容
ansicode

DECCRA / DECFRA / DECERA / DECSERA —— 矩形区域的复制 / 填充 / 擦除 / 选择性擦除

DEC 矩形操作族里改字符内容的四件套 —— 复制一块、用某字模填、擦成空格、只擦未保护单元。与 DECCARA / DECRARA(改属性侧)以及 DECSACE(块 vs 流切换)配套。

字节形式

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

\\x1b[\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[\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[\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 [ESC [ Pts;Pls;Pbs;Prs;Pps;Ptd;Pld;Ppd $ v / $ x / $ z / $ {
hex1b 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;PlPb;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 起算闭区间。

示例

bash
# 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'
python
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()
go
// Pre-fill a help pane with '·' (decimal 183) before drawing content.\nfmt.Print(\"\\x1b[183;1;1;24;80$x\")
javascript
// 'Reset the canvas inset' — DECERA wipes both glyph + attrs to default.\nprocess.stdout.write('\\x1b[2;2;23;79$z');
c
/* 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\");

在哪里用到

实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。

  • vim visual-block `Ctrl-v` operations在 DEC 矩形感知终端(xterm `--enable-rectangle-graphics`)上 vim 的块选粘贴/复制/修改在「粘贴到另一矩形」阶段用 DECCRA `\x1b[...$v` 而不是按单元循环 —— `:set verbose=15` 后 `Ctrl-v` 选块再 `P`,verbose 日志可见矩形操作
  • neovim virtual-block mode (`g Ctrl-v`)Neovim 的虚拟块模式允许选择行末之后;在 xterm 兼容矩形支持上重绘用 DECFRA `\x1b[<sp>;<t>;<l>;<b>;<r>$x` 在绘制前用空格填充虚拟单元 —— 在无矩形支持的终端(多数 VTE)回退到按单元 SGR 循环
  • fbterm / Linux-console no-op fallbackLinux framebuffer 控制台(fbcon)不实现任何 DEC 矩形操作 —— 序列被静默丢弃;应用必须查 `infocmp linux | grep rect`(无输出)并禁用矩形操作代码路径。Apple Terminal、gnome-terminal pre-3.40、konsole < 22.04 同样
  • kitty selection-rectangle modeKitty 的矩形选择(`Alt+拖拽` 或 `kitty.conf: rectangle_select_modifiers ctrl+alt`)原生实现视觉原语,但*不*为剪贴板发 DECCRA —— 改用 OSC 52 输出选择字节。kitty 上 DEC 矩形操作仅限 DECCARA(区域内属性重绘)
  • WezTerm column-selection toggleWezTerm 的列选择(默认 `Ctrl+Shift+拖拽`,可通过 `keys` Lua 配置)通过本地 OpenGL 原语渲染高亮 —— 不经 DECCRA 往返。DEC 矩形操作在解析器中部分实现 `\x1b[...$x` / `\x1b[...$z`(xterm 兼容)但未暴露给用户配置

常见问题

针对这条序列,开发者真正会去搜索的问题的简短回答。

DEC VT 术语中「矩形操作」是什么 —— DECCRA / DECFRA / DECERA / DECCARA / DECRARA?
一组对屏幕*矩形*区域而不是光标所在行/列起作用的 CSI 序列。五个核心:DECCRA \x1b[<srcT>;<srcL>;<srcB>;<srcR>;<srcPage>;<dstT>;<dstL>;<dstPage>$v 把一个矩形复制到另一个,DECFRA \x1b[<ch>;<t>;<l>;<b>;<r>$x 用字符填充,DECERA \x1b[<t>;<l>;<b>;<r>$z 擦除(重置属性),DECCARA \x1b[<t>;<l>;<b>;<r>;<attr>$r 原地改属性,DECRARA \x1b[<t>;<l>;<b>;<r>;<attr>$t 反转属性(XOR)。坐标 1 基且两端*包含*。xterm、mlterm、kitty(部分)支持,几乎别的都不支持 —— VTE 系(gnome-terminal、konsole)不实现;Windows Terminal 仅桩支持 DECCARA。用例是高吞吐 TUI 滚动器(vim 块粘贴、老 DEC VT420 表单编辑器);可移植代码用按单元 CUP+SGR 循环回退。
用 DECCRA / DECFRA 前如何检测矩形操作支持?
没有专门的能力位。规范探针是 XTVERSION \x1b[>q(见 xtversion)—— 含较新补丁号的 \x1bP>|XTerm(...)\x1b\\ 应答或 \x1bP>|kitty(...)\x1b\\ 确认支持;其他一律假设不支持。回退启发式:在一个极小安全区域尝试 DECFRA(如 \x1b[32;1;1;1;1$x 用空格填 (1,1)),再查 DSR \x1b[6n —— 若光标移动了(不应移动)说明终端把序列误解为别的东西。实践中 terminfo 没有 rect_* cap,所以唯一办法是 XTVERSION 或硬编码支持矩阵。最稳模式:提供 --no-rect-ops 旗标关闭优化、回退到按单元循环。

终端支持

xterm
支持
Linux console (fbcon)
不支持
macOS Terminal.app
不支持
iTerm2
部分
Windows Terminal
不支持
cmd.exe / ConPTY
不支持
kitty
部分
alacritty
不支持
WezTerm
部分
Ghostty
部分
GNOME Terminal
支持
Konsole
支持
tmux
支持
GNU screen
支持

相关序列