DECSED / DECSEL — 选择性擦除屏幕 / 行(CSI ? Ps J / CSI ? Ps K)
仅擦除未受保护的单元 —— 显示区(DECSED)或当前行(DECSEL)。即 ED / EL 的私有模式对照。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\\x1b[
\x1b[?<Ps>J (DECSED) \x1b[?<Ps>K (DECSEL)\\033[
\033[?2J / \033[?2K\\e[
\e[?2J / \e[?2KESC [
ESC [ ? Ps J / ESC [ ? Ps Khex
1b 5b 3f ... 4a / 1b 5b 3f ... 4b说明
与 ED(`\x1b[<Ps>J`)和 EL(`\x1b[<Ps>K`)的作用域完全相同(`Ps=0` 光标→末尾,`1` 开始→光标,`2` 整个区域),但会跳过 DECSCA(`\x1b[<Ps>"q`)标记为「受保护」的单元。DECSCA 把单个字符单元标记为受保护(`Ps=1`)或未受保护(`Ps=0` / `2`);DECSED 与 DECSEL 是唯一遵循这一标记的擦除原语。常用于表单 —— 用 DECSCA 把不可变的标签设为受保护并绘制,把用户输入接收在未保护单元,`\x1b[?2K` 只清空输入字段而不影响标签。除了表单 / 数据录入场景,这两个序列极少使用;许多现代模拟器(alacritty、wezterm、ghostty)根本不跟踪 DECSCA,遇到时按普通 ED / EL 处理。除非真要实现 VT220 风格的数据录入表单,否则新代码不要使用。
规范出处: DEC STD 070 (DECSED / DECSEL) / DEC VT510 RM
参数
| Ps | `0`(默认)擦除从光标到区域末尾 · `1` 区域起始到光标 · `2` 整个区域。DECSCA 标记为受保护的单元会被跳过。 |
示例
# Erase only unprotected cells on the current line:\nprintf '\033[?2K'import sys\n# Selective ED 2 — keep DECSCA-protected labels intact:\nsys.stdout.write('\x1b[?2J')fmt.Print("\x1b[?0K") // selective EL: cursor to end of lineprocess.stdout.write('\x1b[?2K') // selective EL: whole line, skip protected cellsprintf("\x1b[?1J"); // selective ED: top of screen to cursor终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 不支持 | 部分 | 部分 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 部分 | 部分 | 不支持 | 不支持 |