私は xterm (v353) で DECSTBM エスケープ シーケンスを試してきました。概ね動作はしましたが、1 つ問題がありました。
スクロール領域をウィンドウの高さより 1 行少なく設定します。less (または man) でファイルを表示すると、スクロール領域内に行が印刷されますが、収まる行数より 1 行多く生成されます。上へスクロールすると、ステータス行がスクロール領域から外れ、スクロールが中断されるように見えます。
別の例として、readline (bash) の「more」補完プロンプトがあります。これは、ウィンドウ サイズが報告する行数と同じ行数を印刷しますが、私の場合は最初の行が画面外にスクロールします。
コードを詳しく調べたところ、less は (ioctl を使用して) システムにウィンドウ サイズを直接要求し、環境変数 COLUMNS または LINES によって指定されたサイズをバイパスしているようです。端末サイズを照会するプログラムに、ウィンドウ サイズではなく、使用可能なスクロール領域を伝達する方法はありますか?
答え1
端末サイズを照会するプログラムに、ウィンドウ サイズではなく使用可能なスクロール領域を伝える方法はありますか?
を試してください。カーネルから返された値を、それを要求するプログラムにstty rows <lines>
( 経由で) 設定します。ioctl(TIOCSWINSZ)
ioctl(TIOCGWINSZ)
ウィンドウのサイズを変更すると、ターミナル エミュレーターによって更新されます。
これは私にとってはうまくいきました(あまり徹底したテストではありませんが)。
winch(){
[ "$LINES" = "$winch_l" ] && return
winch_l=$((LINES-1));
stty rows "$winch_l"
printf '\033[S\033[A' # scroll 1 up, cursor 1 up
printf '\0337' # save cursor (DECSC)
printf '\033[1;%dr' "$winch_l" # set scroll region (DECSTBM)
printf '\0338' # restore cursor (DECRC)
kill -WINCH "$$" # force prompt redraw; ymmv
}
trap winch WINCH
winch