Terminal 在终端的回滚缓冲区中编辑一行

Terminal 在终端的回滚缓冲区中编辑一行,terminal,Terminal,我有一个处理分层组织的数据集的脚本。它为每条记录打印一行。该行在开始处理该记录时首先打印,然后在处理该记录(及其所有子项)完成时更新: completed a completed a.a completed a.b completed a.b.a completed a.b.b completed a.b.c completed a.c processing b completed b.a processing b.b ... 我使用终端转义序列更新

我有一个处理分层组织的数据集的脚本。它为每条记录打印一行。该行在开始处理该记录时首先打印,然后在处理该记录(及其所有子项)完成时更新:

completed a
  completed a.a
  completed a.b
    completed a.b.a
    completed a.b.b
    completed a.b.c
  completed a.c
processing b
  completed b.a
  processing b.b
...
我使用终端转义序列更新行,以在写入之前移动终端光标
“\033[A”
上升到
N行,
“\033[K”
擦除到当前行的末尾,
“\033[s”
保存当前光标位置,
“\033[u”
恢复保存的光标位置

因此,要向上移动2行,请将现有行替换为“已完成的b”,并返回到上一个光标位置:

# save position, go up 2 lines, clear to end of line, insert text, return to saved position
print "\033[s\033[2A\033[Kcompleted b\033[u"
在我尝试过的每个终端中,只要我只想更新屏幕上的一行,这种方法就行。但是,如果一条记录有很多子记录,有时该记录的行已从屏幕上滚下。在这种情况下,上述方法不起作用--“\033[a”转义序列似乎只会将光标移动到视口的顶部——它无法进入历史记录。有没有标准的方法来更新命令行应用程序中已从屏幕上滚动的行