跳到主要内容
ansicode

DECSCA — 选择字符保护属性(CSI Ps " q)

把后续写入的单元标记为受 DECSED / DECSEL 保护(Ps=1)或不受保护(Ps=0 / 2)。

字节形式

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

\\x1b[\x1b[<Ps>"q
\\033[\033[1"q
\\e[\e[1"q
ESC [ESC [ Ps " q
hex1b 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 的同义形式)。

示例

bash
# 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 only
python
import sys\nsys.stdout.write('\x1b[1"qStatic\x1b[0"q dynamic')   # 'Static' is DECSED/DECSEL-protected
go
fmt.Print("\x1b[1\"qHeader\x1b[0\"q body")
javascript
process.stdout.write('\x1b[1"qHeader\x1b[0"q body')
c
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
不支持

相关序列