EL — 行内擦除 (`\x1b[K`)
擦除当前行的部分或全部。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\x1b[NK\033[K\e[KESC [ N K1b 5b <N> 4b说明
末字节为 K。N = 0 从光标位置擦到行尾(默认 —— \x1b[K 与 \x1b[0K 等价);N = 1 从行首擦到光标(含);N = 2 擦除整行。EL 不会移动光标 —— 如需「擦除整行 + 光标到列 1」,请先发 \r(或 \x1b[1G,CHA 列 1)再发 \x1b[2K。被擦除的格子用当前背景色填充,因此非默认 sgr-bg-* 会在擦除区域漫延 —— 这就是 /pitfalls 中记录的 color-bleed 坑。
普遍支持 —— 上面矩阵中每个模拟器(含 Linux console / fbcon 与 ConPTY)都是 yes —— 无明显可移植性问题。反复出现的坑是「光标不动」行为:新手以为 \x1b[2K 同时会把光标移到列 1,于是写入替换文本后变成把新文本拼到旧文本右侧。原地进度的规范习语是 \r\x1b[K 而非 \x1b[2K:少 1 字节,不动尚未重写的部分,并且当下一条进度消息比上一条短时也能干净处理。git 进度条、npm 输出、curl -#、busybox wget 进度行都用这个模式。背景色注意:若设置了非默认 sgr-bg-* 再 EL,被擦除区域填充该背景色;\x1b[K\x1b[49m(先擦除再重置背景)避免漫延。
EL 没有专门的「关闭」—— 它是单发擦除而非切换。重建一行的安全模式是 \r\x1b[K<新内容>\n(CR + 擦到行尾 + 写入 + LF),能承受替换更短、终端调整大小、tmux 分屏切换。多行重绘把 cursor-move(CUU 上移 N 行)与每行的 EL 组合再退回。纵向对应物是 erase-display(\x1b[J)—— 擦到屏底 / 屏首 / 整屏。EL 的 terminfo cap 为 el / el1 / el2(clr_eol / clr_bol / clr_line);针对未知 $TERM 的 shell 脚本,写 tput el 比写裸转义更稳。
规范出处: ECMA-48 §8.3.41 (EL)
示例
printf 'progress... \r\033[Kdone\n'import sys, time\nfor i in range(3): sys.stdout.write(f'\r\x1b[K{i}'); sys.stdout.flush(); time.sleep(0.2)\nprint()fmt.Print("\r\x1b[Kclear line\n")process.stdout.write('\r\x1b[Kclear line\n')printf("\r\x1b[Kclear line\n");在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- bash, zsh readline每次按键前抹掉提示符残留再重绘
- npm, pnpm, yarn progress每次重绘进度前发 EL,让新行覆盖旧行
- git clone, git fetch progress
- ora, cli-spinners (Node)
- fzf incremental query redraw
常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
\x1b[K与\x1b[2K有什么区别?\x1b[K(同\x1b[0K)从光标处擦到行末。\x1b[2K不管光标位置,擦整行。\x1b[1K从行首擦到光标。三者都不移动光标——所以典型的进度条更新是\r\x1b[K<新内容>:回到第 1 列、擦掉尾部、再打出新内容。- 为什么新一行比旧的短时,进度条右侧留下了垃圾字符?
- 你只写了
\r<新内容>没擦——新内容只覆盖与自己字符数相同的列,前一行(更长)留下的尾部字符还在屏上。修法:\r\x1b[K<新内容>——EL 先把光标右侧全擦掉。
终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |