ECH — 擦除字符(CSI Pn X)
在光标处原地擦除 N 个单元 —— 形状与 DCH 相同,但行剩余内容不左移。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\\x1b[
\x1b[PnX\\033[
\033[PnX\\e[
\e[PnXESC [
ESC [ Pn Xhex
1b 5b <Pn> 58说明
Erase Character。末字节 X(0x58)—— 从光标处起把 Pn 个单元(默认 1)替换为空格(SP,0x20,带当前 SGR 背景色)。光标不动,行剩余内容也不左移 —— 这是与 DCH(\x1b[Pn P)的关键区别。当程序需要清空一个固定宽度的字段(输入提示、表格单元、进度条段)而不影响周围内容时使用。ECH 受 DECSTBM 列边距(若启用)约束 —— 右边距外的单元不被波及。terminfo 能力名为 ech(带参数;不存在 ech1,因为「不左移」的语义使带参数形式被普遍需要)。
规范出处: ECMA-48 §8.3.38 (ECH)
示例
# Print a 10-char field, position at col 1, erase 5 chars in place (rest of line preserved).\nprintf '0123456789\033[1G\033[5X'import sys; sys.stdout.write('\x1b[5X') # clear 5 cells in placefmt.Print("\x1b[5X")process.stdout.write('\x1b[5X')printf("\x1b[5X");在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- vim / neovim `:redraw!` per-cell repaint`'lazyredraw'` 关闭时,vim 屏幕重绘在「新单元为空、SGR 背景与上一行相同」的跨度上发 ECH —— 比 DCH 更便宜,因行宽不变所以右边缘无需再重绘
- bash readline prompt redraw on history-backbash readline 在「`Up` 箭头召回历史命令、新行长度相同」的场景下,对上一提示符的尾部宽度发 ECH,避免 `\x1b[K` 全 EOL 清除的成本 —— 在 `bind -p | grep delete-char` 跟踪与 `READLINE_DEBUG` 日志中可见
- htop column-cell updatehtop 用 ECH 按单元重绘 CPU / 内存条填充,而非整行 —— 值未变的单元保留上次渲染;值已变的单元得到一次性 ECH+重写,让单帧字节成本与变化单元数成正比
- less / more status-line update on file-position changeless ≥ 600 在文件滚动时用 ECH 重绘底行 `:` 状态的字节计数与已读百分比槽位 —— 让每次按键状态重绘字节数 < 30,对 `\x1b[K` + 全重打的 ~80 字节
- terminfo `ech` capability (`ech1` is intentionally absent)现代每个 terminfo 条目里 `ech` 能力都带参数 —— 不存在 `ech1` 缩写,因为「不左移」语义让计数参数普遍需要;`tput ech 5` 在 `xterm-256color` 与 `tmux-256color` 上解析为 `\x1b[5X`
常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
- ECH(
\x1b[5X)和 DCH(\x1b[5P)有什么区别? - ECH(Erase Character —— 末字节
X,0x58)从光标处起用 SP *覆盖*Pn个单元,行整体宽度不变。DCH(Delete Character —— 末字节P,0x50)*移除*Pn个单元并把光标右侧内容左移Pn位。需要清空固定宽度字段(输入提示、表格单元、进度条段)而不扰动右侧时选 ECH;需要光标右侧内容真的左移(例如行编辑器的「删除字符」)时选 DCH。两者光标都不动,都用当前 SGR 背景色填充被清空的单元。 - 为什么
\x1b[K(EL)不能替代 ECH? - EL(Erase in Line)按模式字节(
0/1/2)分别擦*到行尾*、*从行首*、*整行* —— 没有固定宽度计数。ECH 恰好擦Pn个单元。重绘提示符想把残留尾巴(「旧提示符更长」)擦掉用 EL;有精确宽度要擦且不影响后续用 ECH。提示符重绘的常见惯用法:先用 ECH 擦已知宽度的前缀,再\x1b[K作为「新提示符更短」时的安全兜底。
终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 支持 | 支持 | 支持 | 支持 | 部分 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
相关序列
在家族食谱中
CSI 食谱 · 6. 插入 / 删除 / 光标形状 —— IL / DL / ICH / DCH / ECH + DECSCUSR