行削除 (DL)

現在のカーソル位置で `n` 行を削除し、既存の 行を上にずらします。

  1. 0x1B
    ESC
  2. 0x5B
    [
  3. ____
    n
  4. 0x4D
    M

パラメーター n は 1 以上の整数でなければなりません。n が 0 以下の 場合は n を 1 に調整します。n が省略された場合は n が既定で 1 になります。

現在のカーソル位置が現在のスクロール領域の外にある場合、 このシーケンスは何もしません。カーソルは、上マージン より上にある場合、 下マージン より下にある場合、左マージン より左にある場合、 右マージン より右にある場合に、現在のスクロール領域の外にあります。

このシーケンスは保留中の折り返し状態を解除します。

このシーケンスはカーソルの列を左マージンへ移動します。

現在のスクロール領域の先頭 n 行を削除し、既存の行を上にずらします。 スクロール領域の末尾にできた空きは、現在の SGR 状態に従った背景色で 空白にします。

左マージン または 右マージン が設定されている場合、 マージン内(マージンを含む)のセルだけが削除または移動されます。 左マージンの左側、または右マージンの右側にあるその他の既存コンテンツは そのまま維持されます。

複数セル文字が分割される場合は、その複数セル文字全体を消去します。たとえば、 「橋」が左マージンの左側に表示されていて、DL による行移動でこの文字が 分割される場合、そのセルは消去されます。

検証

DL 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[M"
|ABC_____|
|GHI_____|

DL V-2: スクロール領域の外にカーソルがある

printf "\033[1;1H" # move to top-left
printf "\033[0J" # clear screen
printf "ABC\n"
printf "DEF\n"
printf "GHI\n"
printf "\033[3;4r" # scroll region top/bottom
printf "\033[2;2H"
printf "\033[M"
|ABC_____|
|DEF_____|
|GHI_____|

DL V-3: 上下スクロール領域

printf "\033[1;1H" # move to top-left
printf "\033[0J" # clear screen
printf "ABC\n"
printf "DEF\n"
printf "GHI\n"
printf "123\n"
printf "\033[1;3r" # scroll region top/bottom
printf "\033[2;2H"
printf "\033[M"
|ABC_____|
|GHI_____|
|________|
|123_____|

DL V-4: 左右スクロール領域

printf "\033[1;1H" # move to top-left
printf "\033[0J" # clear screen
printf "ABC123\n"
printf "DEF456\n"
printf "GHI789\n"
printf "\033[?69h" # enable left/right margins
printf "\033[2;4s" # scroll region left/right
printf "\033[2;2H"
printf "\033[M"
|ABC123__|
|DHI756__|
|G___89__|