跳到主要内容
ansicode

ED — 清屏 (`\x1b[2J`)

擦除屏幕的部分或全部。

字节形式

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

\\x1b[\x1b[NJ
\\033[\033[2J
\\e[\e[2J
ESC [ESC [ N J
hex1b 5b <N> 4a

说明

Erase in Display(屏内擦除)。末字节为 J。参数 N 决定范围:0 = 光标到屏末(默认);1 = 屏首到光标(含);2 = 整个可视屏幕;3 = 整个屏幕加滚动缓冲区(xterm 扩展,自 v333 起,2006 年)。光标本身不移动 —— ED 在原地擦除单元。「清屏」标准配方是 \x1b[2J\x1b[H:一次缓冲刷新里完成擦除 + 回家。ECMA-48 §8.3.39 规定参数 0–2;3(擦回滚)是 xterm 私有扩展,也是 GNU clear -x 在 terminfo 条目声明 E3 能力时发的字节(现代 xterm-256color、kitty、alacritty、wezterm、ghostty、gnome-terminal、konsole 都带)。

两个陷阱。(1)默认参数陷阱:\x1b[J 默认 N = 0(「从光标擦到屏末」),而非「擦 0 格 / 空操作」。「为安全发个 \x1b[J」的程序会静默抹掉光标行以下的全部内容 —— 每条指令的默认值表见 csi-default-params。(2)模式 3 并非通用:Linux console / fbcon 忽略 \x1b[3J(内核层不存在滚动缓冲区);macOS Terminal.app 支持;conhost.exe(旧式 cmd)没有独立的滚动缓冲;ConPTY 在 Win10 1809+ 透传字节不变。alt-screen 内的行为有微妙之处:\x1b[2J 擦的是 alt 缓冲的可视区,原 primary 缓冲不动(DECSET 1049 单独保存了它)—— 用 \x1b[?1049l 退出 alt-screen 时会完整恢复 primary 缓冲,与 alt 内 ED 多激烈无关(见 alt-screen / crlf-under-alt-screen)。优先用 \x1b[2J\x1b[H 而非遗留的 \x1bc(RIS —— ris-reset);RIS 做完整硬件重置(含 SGR / 字符集 / 调色板),仅想清屏时是杀鸡用牛刀。

ED 不动光标 —— 配 CUP(\x1b[H)在擦除后定位(见 cursor-position)。需要按行擦除用 EL(erase-line,末字节 K),同样有默认参数陷阱。要「重置一切但不破坏用户终端」,用 DECSTR(decstr-soft-reset —— \x1b[!p)而非 RIS;它重置字符集、模式、边距与 SGR,却不抹掉回滚或调色板。给动画 TUI 用时,把 ED 的范围限制到实际改动的行 —— 每帧发 \x1b[2J 会在较慢的远端终端上肉眼可见地闪烁。

规范出处: ECMA-48 §8.3.39 (ED)

示例

bash
printf '\033[2J\033[H'
python
print('\x1b[2J\x1b[H', end='')
go
fmt.Print("\x1b[2J\x1b[H")
javascript
process.stdout.write('\x1b[2J\x1b[H')
c
printf("\x1b[2J\x1b[H");

在哪里用到

实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。

  • clear(1), reset(1)POSIX 的 clear 本质上就是这串序列
  • htop, top, btop initial paint
  • tput clear
  • vim :redraw!, neovim equivalents

常见问题

针对这条序列,开发者真正会去搜索的问题的简短回答。

为什么 \x1b[2J 清不掉滚动历史?
\x1b[2J 只清可见屏幕——滚动历史在独立缓冲里。用 \x1b[3J(xterm 扩展)同时清滚动历史,或先用 \x1b[H 把光标移到顶部:printf '\033[H\033[2J\033[3J' 在多数现代终端上与 clear 命令等价。
\x1b[0J\x1b[1J\x1b[2J 有何区别?
\x1b[0J(默认,也写作 \x1b[J)从光标处擦到屏幕末尾。\x1b[1J 从屏幕开头擦到光标处。\x1b[2J 擦整个可见屏幕。三者都不移动光标——擦完想让光标到左上角就配 \x1b[H。三者都保留滚动历史;要连滚动历史一起擦,用 \x1b[3J

终端支持

xterm
支持
Linux console (fbcon)
支持
macOS Terminal.app
支持
iTerm2
支持
Windows Terminal
支持
cmd.exe / ConPTY
支持
kitty
支持
alacritty
支持
WezTerm
支持
Ghostty
支持
GNOME Terminal
支持
Konsole
支持
tmux
支持
GNU screen
支持

相关序列

在家族食谱中

CSI 食谱 · 1. 信封 —— `\x1b[` …… `<结尾字节>`