擦除字元 (ECH)

從游標處開始(含游標)向右擦除 `n` 個儲存格。

  1. 0x1B
    ESC
  2. 0x5B
    [
  3. ____
    n
  4. 0x58
    X

參數 n 必須是大於等於 1 的整數。如果 n 小於 等於 0,則將 n 調整為 1。如果省略 n,則 n 預設為 1。

可擦除的最右欄是畫面的最右欄。 右邊界 對此序列沒有影響。

此序列總是取消待定換行狀態。如果游標所在的列 是軟換行的,那麼軟換行狀態也會被重設。

對於 n 個儲存格(直至最右欄),透過將其替換為 一個空白字元來清空儲存格,其背景色按 目前 SGR 狀態著色。不保留其他 SGR 屬性。

如果多儲存格字元會被拆分,則擦除整個多儲存格字元。例如, 如果列印了「橋」並發出 ECH n = 1, 則即使該字元佔用兩個儲存格,也應擦除整個字元。 被擦除的兩個儲存格都按目前 SGR 狀態以目前背景色著色。

如果 字元選擇屬性選擇 (DECSCA) 已啟用, 或它是目前作用中的畫面上最近一次啟用的保護模式, 則受保護屬性會被忽略,彷彿從未設定過,帶有這些屬性的儲存格會被擦除。 即使 DECSCA 目前已停用也沒有關係,只要 DECSCA 是 _最近一次啟用_的保護模式,受保護屬性仍會被忽略。

如果 DECSCA 目前未啟用,也不是目前作用中畫面上最近一次啟用的 保護模式,則帶有受保護屬性的儲存格會被尊重,不被擦除,但仍計入 n。 儲存格的保護屬性最初是否由 DECSCA 設定並不重要。

驗證

ECH V-1:簡單操作

printf "ABC"
printf "\033[1G"
printf "\033[2X"
|c_C_____|

ECH V-2:擦除越出畫面邊緣

cols=$(tput cols)
printf "\033[${cols}G"
printf "\033[2D"
printf "ABC"
printf "\033[D"
printf "\033[10X"
|_____Ac_|

ECH V-3:重設待定換行狀態

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

ECH V-4:SGR 狀態

printf "ABC"
printf "\033[1G"
printf "\033[41m"
printf "\033[2X"
|c_C_____|

c_ 個儲存格都應有紅色背景。所有其他儲存格樣式保持不變。

ECH V-5:多儲存格字元

printf "橋BC"
printf "\033[1G"
printf "\033[X"
printf "X"
|XcBC____|

ECH V-6:左/右捲動區域被忽略

printf "\033[1;1H" # move to top-left
printf "\033[0J" # clear screen
printf "\033[?69h" # enable left/right margins
printf "\033[1;3s" # scroll region left/right
printf "\033[4G"
printf "ABC"
printf "\033[1G"
printf "\033[4X"
|c___BC____|

ECH V-7:使用 DECSCA 時忽略受保護屬性

printf "\033V"
printf "ABC"
printf "\033[1\"q"
printf "\033[0\"q"
printf "\033[1G"
printf "\033[2X"
|c_C_______|

ECH V-8:不使用 DECSCA 時尊重受保護屬性

printf "\033[1\"q"
printf "ABC"
printf "\033V"
printf "\033[1G"
printf "\033[2X"
|ABC_______|

游標保持在 A 處。