lessでxtermのスクロール領域を使用する

lessでxtermのスクロール領域を使用する

私は 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

関連情報