0

我基本上想操纵连接到终端的某些程序的输出,以便文本的底部始终是任意文本块(我们称之为页脚),而程序的正常输出显示在其上方。如果此页脚仅限于单个终端行,则只需清除当前行,在每次write调用之前将光标移动到行首,然后重写页脚,就可以很容易地做到这一点。但是,如果我想要的页脚跨越多个终端行,无论是通过包含换行符还是通过环绕屏幕边缘的行,事情都会变得复杂。我想我可以使用“保存光标”和“恢复光标”VT100 控制代码来解决这个问题,每次写入都会发出这些代码:

  1. 恢复光标
  2. 想要的write电话
  3. 保存光标
  4. 输出页脚

但是,当输出文本到达终端底部时,这些不起作用,因为保存的光标将始终位于底行。

有没有办法实现这个任意的终端页脚?只有 VT100 代码的东西是理想的,但如果唯一的方法是使用诅咒,那么我想这也是可能的。

4

2 回答 2

2

问题是 VT100 不允许文本窗口或固定滚动窗口(也许是一个更好的术语)。

所以,这留给你来管理。

诅咒是最简单的,因为您可以在您的代码中打开两个单独的窗口,一个用于“文本”,一个用于页脚,然后让诅咒在它认为合适的时候更新屏幕。

仅使用原始 VT100,您必须跟踪何时滚动。当您滚动时,您可以删除顶行,然后在页脚之前插入一个空白行,然后在新的空白行上书写。

当然,Curses 会为你处理所有这些。

于 2018-08-07T22:59:51.660 回答
1

您可以使用滚动区域来执行此操作。像这样的东西(请记住,虽然您可以对转义序列进行硬编码,但这更具可读性):

#!/bin/sh
rows=$(tput lines)
foot=$((rows - 4))
tput csr 1 $((foot - 1))
count=0
while true
do
        date
        count=$((count + 1))
        tput sc
        tput cup $foot 1
        printf "Total cycles %d", $count
        tput rc
        sleep 1
done
于 2018-08-08T01:32:31.433 回答