上端と下端のマージン設定 (DECSTBM)

上端マージンと下端マージン(いわゆるスクロール領域)を設定します。

  1. 0x1B
    ESC
  2. 0x5B
    [
  3. ____
    t
  4. 0x3B
    ;
  5. ____
    b
  6. 0x72
    r

パラメーター t と b は整数値です。いずれかが 0 の場合、その値は 既定値にリセットされます。t の既定値は 1 で、 b の既定値は画面の行数です。

値 t と b は省略できます。いずれかを省略した場合、 その既定値が使われます。なお、t を省略して b を省略しないことはできません。有効なシーケンスは CSI t ; b r、 CSI t r、CSI r だけです。

top が bottom 以上の場合、このシーケンスは何もしません。スクロール領域は 少なくとも 2 行必要です(b は t より大きくなければなりません)。 このシーケンス記述の残りの部分では、t と b が有効な値であると想定します。

このシーケンスは保留中の折り返し状態を解除し、カーソルを 画面の左上へ移動します。原点モード が設定されている場合、カーソルは スクロール領域の左上へ移動されます。

スクロール領域をリセットするには、このシーケンスを両方の値を "0" にして 呼び出します。これにより t と b の既定値が 強制的に適用され、画面全体が対象になります。

上端マージンと下端マージンで、いわゆる_スクロール領域_が構成されます。 スクロール領域は、行挿入、カーソル下移動 など 多くのシーケンスの動作に影響します。スクロール領域により、ターミナルへの変更を 画面内の矩形領域に制限する、効果的かつ効率的な手段になります。

検証

DECSTBM 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[r" # scroll region top/bottom
printf "\033[T"
|c_______|
|ABC_____|
|DEF_____|
|GHI_____|

DECSTBM 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[2r" # scroll region top/bottom
printf "\033[T"
|ABC_____|
|________|
|DEF_____|
|GHI_____|

DECSTBM 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 "\033[1;2r" # scroll region top/bottom
printf "\033[T"
|________|
|ABC_____|
|GHI_____|

DECSTBM 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;2r" # scroll region top/bottom
printf "\033[T"
|________|
|ABC_____|
|DEF_____|
|GHI_____|