擦除显示 (ED)

擦除显示内容,具体行为取决于命令 `n`。

  1. 0x1B
    ESC
  2. 0x5B
    [
  3. ____
    n
  4. 0x4A
    J

如果未设置 n,则 n 的值为 0。n 的唯一有效值是 0、1、2 或 3。如果给出了任何其他 n 值,则不执行此序列。 此序列文档的其余部分假定 n 是有效值。

对于除 3 以外的所有有效 n 值,此序列会取消待定换行状态。 光标位置在整个序列执行期间 始终保持不变。

如果 字符选择属性选择 (DECSCA) 已启用, 或它是当前活动屏幕上最近一次启用的保护模式, 则受保护属性会被忽略。否则,受保护属性会被尊重。有关此受保护属性 处理逻辑的更多细节,请参见 擦除字符 (ECH)。

对于所有操作,如果多单元格字符会被拆分,则擦除整个多单元格字符。 例如,如果打印了“橋”,而擦除操作只会擦除该两单元格字符的第一或 第二个单元格,则两个单元格都应被擦除。

此序列不遵守任何滚动区域(顶部、底部、左侧或右侧)。 操作的边界是整个可见屏幕。

如果 n 为 0,执行擦除下方显示操作。 擦除光标右侧及下方的所有单元格。被擦除单元格的 背景色按当前 SGR 状态着色。

如果 n 为 1,执行擦除上方显示操作。 擦除光标左侧及上方的所有单元格。被擦除单元格的 背景色按当前 SGR 状态着色。

如果 n 为 2,擦除整个显示。这等同于 擦除上方(n = 1)与擦除下方(n = 0)同时执行。

如果 n 为 3,只擦除回滚缓冲区。这不会影响 屏幕的可见显示,也不会移动光标。回滚 区域是当屏幕完全滚动到底部时,目前处于 屏幕可见区域之上的终端区域。

校验

ED V-1:简单擦除下方

printf "\033[1;1H" # move to top-left
printf "\033[0J" # clear screen
printf "ABC\n"
printf "DEF\n"
printf "GHI\n"
printf "\033[2;2H"
printf "\033[0J"
|ABC_____|
|Dc______|
|________|

ED V-2:擦除下方的 SGR 状态

printf "\033[1;1H" # move to top-left
printf "\033[0J" # clear screen
printf "ABC\n"
printf "DEF\n"
printf "GHI\n"
printf "\033[2;2H"
printf "\033[41m"
printf "\033[0J"
|ABC_____|
|Dc______|
|________|

光标右方及下方的所有单元格都应被着色为红色。

ED V-3:擦除下方的多单元格字符

printf "\033[1;1H" # move to top-left
printf "\033[0J" # clear screen
printf "AB橋C\n"
printf "DE橋F\n"
printf "GH橋I\n"
printf "\033[2;4H"
printf "\033[0J"
|AB橋C___|
|DE_c____|
|________|

ED V-4:简单擦除上方

printf "\033[1;1H" # move to top-left
printf "\033[0J" # clear screen
printf "ABC\n"
printf "DEF\n"
printf "GHI\n"
printf "\033[2;2H"
printf "\033[1J"
|________|
|_cF_____|
|GHI_____|

ED V-5:简单擦除全部

printf "\033[1;1H" # move to top-left
printf "\033[0J" # clear screen
printf "ABC\n"
printf "DEF\n"
printf "GHI\n"
printf "\033[2;2H"
printf "\033[2J"
|________|
|_c______|
|________|