使用ansi控制序列清除屏幕上方的内容

时间:2018-11-14 09:55:37

标签: terminal

我正在尝试构建一个简单的终端用户界面,该界面显示每秒更新的字符串(有点像watch -n 1 <command>,但没有进行全屏刷新),并且当要刷新的内容大于终端仿真器屏幕。我觉得不使用诅咒就应该可以解决,但我无法弄清楚。

我编写的程序非常简单,其逻辑工作原理如下(这是python中的伪代码,实际的脚本位于Haskell中,但这不应改变问题)。

ansi_clearline = "\033[2K"
ansi_upline = "\033[1A"

printed_value = fetch_value() # String formatted for display to the terminal
print(printed_value)
while True:
    num_lines = len(printed_value.split("\n"))
    control_chars = ansi_upline.join(num_lines * [ansi_clearline])
    printed_value = fetch_value()
    print(control_chars)
    print(intial_value)

也就是说,对于最后一个输出中的每一行,我们打印一个控制序列以清除该行,然后打印一个控制序列以将一行向上移动,除了第一行只打印一条清晰的行。

只要所有内容都适合终端仿真器屏幕,此方法就可以正常工作。不幸的是,如果输出(printed_value)比仿真器屏幕长,则会中断。大概是因为ansi控制序列对移入后退缓冲区一无所知,并且一旦进入屏幕顶部,就不会让您向上移动一行。如下所示:

lineone   
linetwo
         ------top of screen
linethree
linefour
linefive
         -------Bottom of screen

Scroll up a bit with the mouseo

lineone   
linetwo
         ------top of screen
lineone   
linetwo
lineone   
         -------Bottom of screen
linetwo
linethree
linefour
linefive

希望该图形可以清楚地说明正在发生的事情。有没有办法实现我想要做的事情(有效地使用控制序列来清除部分回滚缓冲区)而无需使用curses?

0 个答案:

没有答案