私はxterm(v353)でDECSTBMエスケープシーケンスを試してきました。これが一般的に機能している間に問題が発生しました。
スクロール領域をウィンドウの高さより1行小さく設定します。 less(またはman)でファイルを表示すると、スクロール領域内に行が印刷されますが、フィットよりも1行多く生成されます。後方にスクロールすると、ステータスバーがスクロール領域から滑り落ち、スクロールが中断されるように頻繁に表示されます。
別の例は、readline(bash) の「more」完了プロンプトです。このプロンプトは、ウィンドウサイズを報告するのと同じくらい多くの行を印刷します。私の場合は、画面の最初の行をスクロールします。
コードをより深く掘り下げながら(ioctlを使用して)システムに直接ウィンドウサイズを要求することが少なく、環境変数COLUMNSまたはLINESによって提供されるサイズをバイパスすることが少ないことがわかりました。端末サイズを照会するプログラムに、ウィンドウサイズの代わりに使用可能なスクロール領域を渡す方法はありますか?
ベストアンサー1
端末サイズを照会するプログラムに、ウィンドウサイズの代わりに使用可能なスクロール領域を渡す方法はありますか?
try 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