擦除行 (EL)

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

  1. 0x1B
    ESC
  2. 0x5B
    [
  3. ____
    n
  4. 0x4B
    K

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

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

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

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

如果 n 为 0,执行擦除行右侧操作。擦除行右侧 等同于 擦除字符 (ECH),且 n 设为 从光标到行尾(含光标)的剩余列总数。如果该行是软换行的, 则只擦除这一个行;不会透过换行擦除。此外,该行的换行 状态会被重置,使该行不再被视为换行的。

如果 n 为 1,执行擦除行左侧操作。这会把 光标左侧及光标所在的 n 个单元格替换为空白字符,并 按当前 SGR 状态给背景着色。可以清空的最左 列是屏幕第一列。 左边距 对此操作没有影响。

如果 n 为 2,擦除整行。这等同于 擦除左(n = 1)与擦除右(n = 0)同时执行。

校验

EL V-1:简单擦除右

printf "ABCDE"
printf "\033[3G"
printf "\033[0K"
|ABc_____|

EL V-2:擦除右时重置待定换行

cols=$(tput cols)
printf "\033[${cols}G" # move to last column
printf "A" # set pending wrap state
printf "\033[0K"
printf "X"
|_______X|

光标应位于 'X' 上

EL V-3:擦除右的 SGR 状态

printf "ABC"
printf "\033[2G"
printf "\033[41m"
printf "\033[0K"
|Ac______|

从 c 起、一直到屏幕右边缘的所有单元格都应有红色背景。

EL V-4:擦除右的多单元格字符

printf "AB橋DE"
printf "\033[4G"
printf "\033[0K"
|AB_c____|

EL V-5:擦除右,左/右滚动区域被忽略

printf "\033[1;1H" # move to top-left
printf "\033[0J" # clear screen
printf "ABCDE"
printf "\033[?69h" # enable left/right margins
printf "\033[1;3s" # scroll region left/right
printf "\033[2G"
printf "\033[0K"
|Ac________|

EL V-6:擦除右,使用 DECSCA 时忽略受保护属性

printf "\033V"
printf "ABCDE"
printf "\033[1\"q"
printf "\033[0\"q"
printf "\033[2G"
printf "\033[0K"
|Ac________|

EL V-7:不使用 DECSCA 时尊重受保护属性

printf "\033[1\"q"
printf "ABCDE"
printf "\033V"
printf "\033[2G"
printf "\033[0K"
printf "\033[1K"
printf "\033[2K"
|ABCDE_____|

EL V-8:简单擦除左

printf "ABCDE"
printf "\033[3G"
printf "\033[1K"
|__cDE___|

EL V-9:擦除左的 SGR 状态

printf "ABC"
printf "\033[2G"
printf "\033[41m"
printf "\033[1K"
|_cC_____|

从 c 起向左的所有单元格都应有红色背景。

EL V-10:擦除左的多单元格字符

printf "AB橋DE"
printf "\033[3G"
printf "\033[1K"
|__c_DE__|

EL V-11:擦除左,使用 DECSCA 时忽略受保护属性

printf "\033V"
printf "ABCDE"
printf "\033[1\"q"
printf "\033[0\"q"
printf "\033[2G"
printf "\033[1K"
|_cCDE_____|

EL V-12:简单擦除整行

printf "ABCDE"
printf "\033[3G"
printf "\033[2K"
|__c_______|

EL V-13:擦除整行的 SGR 状态

printf "ABC"
printf "\033[2G"
printf "\033[41m"
printf "\033[2K"
|_c______|

整行都应有红色背景。