在 xterm 中使用 less 的滾動區域

在 xterm 中使用 less 的滾動區域

我一直在 xterm (v353) 中試驗 DECSTBM 轉義序列。雖然一般都可以工作,但我遇到了一個問題:

我會將滾動區域設定為比視窗高度少一行。當使用 less (或 man)查看文件時,它會在滾動區域內列印行,但它會產生比適合的多一行。當向後滾動時,狀態行會滑到滾動區域之外,並且滾動通常看起來會中斷。
另一個例子是來自 readline (bash) 的「更多」完成提示,它會列印與視窗大小報告一樣多的行,在我的例子中,將第一行滾動到螢幕之外。

透過深入研究程式碼,我發現 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

相關內容