倒回 VT100 终端命令中的一段文本
Rewind past a block of text in VT100 terminal commands
我基本上想操纵连接到终端的某些程序的输出,以便文本的底部始终是一些任意文本块(我们称之为页脚),同时显示程序的正常输出在那之上。如果此页脚仅限于单个终端行,只需清除当前行,在每次 write
调用之前将光标移至行首,然后重写页脚,即可轻松实现。但是,如果我想要的页脚跨越多个终端行,无论是通过包含换行符还是通过环绕屏幕边缘的行,事情都会很复杂。我想我可以使用 "save cursor" 和 "restore cursor" VT100 控制代码来解决这个问题,每次写入都会发出这样的代码:
- 恢复光标
- 需要
write
呼叫
- 保存光标
- 输出页脚
但是,当输出文本到达终端底部时,这些功能不起作用,因为保存的光标将始终位于底部行。
有什么办法可以实现这个任意的终端页脚吗?只有 VT100 代码的东西是理想的,但如果唯一的方法是使用 curses 那么我想那也是可能的。
问题是 VT100 不允许文本 windows 或固定滚动 windows(也许是更好的术语)。
那么,这就交给您来管理了。
Curses 最简单,因为您可以在代码中打开两个单独的 windows,一个用于 "text",一个用于页脚,然后让 curses 更新屏幕觉得合适。
仅使用原始 VT100,您必须跟踪何时滚动。滚动时,您可以删除顶行,然后在页脚前插入一个空行,然后在新的空行上书写。
当然,Curses 会为您处理所有这些。
您可以使用滚动区域来做到这一点。像这样(请记住,虽然您可以对转义序列进行硬编码,但这样可读性更强):
#!/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
我基本上想操纵连接到终端的某些程序的输出,以便文本的底部始终是一些任意文本块(我们称之为页脚),同时显示程序的正常输出在那之上。如果此页脚仅限于单个终端行,只需清除当前行,在每次 write
调用之前将光标移至行首,然后重写页脚,即可轻松实现。但是,如果我想要的页脚跨越多个终端行,无论是通过包含换行符还是通过环绕屏幕边缘的行,事情都会很复杂。我想我可以使用 "save cursor" 和 "restore cursor" VT100 控制代码来解决这个问题,每次写入都会发出这样的代码:
- 恢复光标
- 需要
write
呼叫 - 保存光标
- 输出页脚
但是,当输出文本到达终端底部时,这些功能不起作用,因为保存的光标将始终位于底部行。
有什么办法可以实现这个任意的终端页脚吗?只有 VT100 代码的东西是理想的,但如果唯一的方法是使用 curses 那么我想那也是可能的。
问题是 VT100 不允许文本 windows 或固定滚动 windows(也许是更好的术语)。
那么,这就交给您来管理了。
Curses 最简单,因为您可以在代码中打开两个单独的 windows,一个用于 "text",一个用于页脚,然后让 curses 更新屏幕觉得合适。
仅使用原始 VT100,您必须跟踪何时滚动。滚动时,您可以删除顶行,然后在页脚前插入一个空行,然后在新的空行上书写。
当然,Curses 会为您处理所有这些。
您可以使用滚动区域来做到这一点。像这样(请记住,虽然您可以对转义序列进行硬编码,但这样可读性更强):
#!/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