跳到主要内容
ansicode

ECH — 擦除字符(CSI Pn X)

在光标处原地擦除 N 个单元 —— 形状与 DCH 相同,但行剩余内容不左移。

字节形式

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

\\x1b[\x1b[PnX
\\033[\033[PnX
\\e[\e[PnX
ESC [ESC [ Pn X
hex1b 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)

示例

bash
# Print a 10-char field, position at col 1, erase 5 chars in place (rest of line preserved).\nprintf '0123456789\033[1G\033[5X'
python
import sys; sys.stdout.write('\x1b[5X')   # clear 5 cells in place
go
fmt.Print("\x1b[5X")
javascript
process.stdout.write('\x1b[5X')
c
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
支持

相关序列

在家族食谱中

CSI 食谱 · 6. 插入 / 删除 / 光标形状 —— IL / DL / ICH / DCH / ECH + DECSCUSR