DECSCA — 选择字符保护属性(CSI Ps " q)
把后续写入的单元标记为受 DECSED / DECSEL 保护(Ps=1)或不受保护(Ps=0 / 2)。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\\x1b[
\x1b[<Ps>"q\\033[
\033[1"q\\e[
\e[1"qESC [
ESC [ Ps " qhex
1b 5b ... 22 71说明
Select Character Protection Attribute —— 切换 DECSED(`\x1b[?<Ps>J`)与 DECSEL(`\x1b[?<Ps>K`)所遵循的保护位。`Ps=0`(默认)把后续单元标记为不受保护;`Ps=1` 标记为受保护;`Ps=2` 是显式的「不受保护」别名(依 DEC STD 070)。中间字节是**字面 `"`(0x22)** —— 容易误写为参数字节。区域绘制后,DECSED / DECSEL 在选择性擦除时跳过受保护单元,而普通 ED / EL 仍会清除。DEC 的数据录入表单模型利用这对原语渲染不可变标签、在间隙接收用户输入,每次擦除无需重绘标签。完全不跟踪 DECSCA 的现代模拟器(alacritty、wezterm、ghostty、kitty 0.32 之前)会静默忽略 DECSCA 并把 DECSED / DECSEL 视为普通 ED / EL —— 设计表单时应假设这种回退,或通过 DECRQSS(DCS $q"q)探测。如今大多 TUI 作者在用户态做渲染 diff,不再依赖通过终端往返 DECSCA。
规范出处: DEC STD 070 (DECSCA) / DEC VT510 RM
参数
| Ps | `0`(默认)未受保护 · `1` 受保护 · `2` 未受保护(依 DEC STD 070 的同义形式)。 |
示例
# Protect the next bytes, write a label, accept input in the gap:\nprintf '\033[1"qLabel: \033[0"q'\n# now any user input written here is in an unprotected cell\nprintf '\033[?2K' # selective EL: clears input onlyimport sys\nsys.stdout.write('\x1b[1"qStatic\x1b[0"q dynamic') # 'Static' is DECSED/DECSEL-protectedfmt.Print("\x1b[1\"qHeader\x1b[0\"q body")process.stdout.write('\x1b[1"qHeader\x1b[0"q body')printf("\x1b[1\"qHeader\x1b[0\"q body\n");终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 不支持 | 部分 | 部分 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 部分 | 部分 | 不支持 | 不支持 |