文字消去 (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 が発行された場合、 その文字が 2 セルを占めていても全体を消去します。消去された 2 つのセルはどちらも、現在の 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 の位置に留まります。