在 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

相关内容