使用两行提示清除终端屏幕并保持两行可见

时间:2016-08-04 06:41:12

标签: bash terminal zsh readline

我有两行提示,如下所示。是否有像clear这样的命令可以清除屏幕,但保持提示符的两行行?

~/current/directory git-branch*
$ echo 'hello...

1 个答案:

答案 0 :(得分:0)

简短:不,没有这样的命令。

long:你可以编写脚本。以下是该主题的简要介绍。

clear程序会清除整个屏幕。您的shell将绘制一个新提示(位于新清除屏幕的顶部)。但是假设你想在命令完成之前清除部分屏幕,然后返回shell。

您使用的大多数终端都支持ANSI转义序列,该转义序列从当前光标位置清除到屏幕末尾,即terminfo capability ed

   clr_eos                   ed     cd   clear to end of
                                         screen (P*)

infocmp显示为ed=\E[J

您可以在脚本中使用它,例如,使用tput

tput ed

这是“ansi.sys”与ANSI标准不同的区域之一(实际上是ECMA-48,请参阅 8.3.29 ERASE IN PAGE )。 ansi.sys收到

后清除整个屏幕
printf '\033]J'

有些人将其硬编码为脚本,并假设“ansi.sys”符合标准。请参阅ncurses常见问题解答中的 How do I get color with VT100?

注意到有关如何测试此问题的评论:可能在提示下方的屏幕上没有任何内容。因此,键入tput ed似乎无能为力。如上所述,它清除光标下面的 。如果你想在(2行)提示上方清除,那就更复杂了:

  • 保存光标位置
  • 将光标向上移动两行
  • 光标
  • 之前清除
  • 恢复光标位置。

如果您的提示恰好位于屏幕的第一行,则可以使用光标位置报告检测 。但这比措辞所预期的问题更复杂。假设上面有空格:

tput sc
tput cuu 2
tput cub 999
printf '\033[1J'
tput rc

此处使用常规printf而不是tput,因为没有为该类型的擦除定义的预定义terminfo(或termcap)功能。

如果您想要处理提示在终端顶行开始的情况,您必须找到当前行并决定是否进行上述清算(或不)。

进一步阅读: