【问题标题】:Clear terminal screen with a two line prompt and keep both lines visible使用两行提示清除终端屏幕并保持两行可见
【发布时间】:2016-08-04 06:41:12
【问题描述】:

我有如下两行提示。是否有类似clear 的命令可以清除屏幕但保持提示符的两行 可见?

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

【问题讨论】:

  • 清除保留多行提示...
  • 哦,你是对的。我正在使用 C-l 并且它没有相同的行为。我以为他们是一样的。

标签: bash terminal zsh readline


【解决方案1】:

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

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 可能看起来什么都不做。如上所述,它会清除 below 光标。如果你想清除上面的(2行)提示,那就有点复杂了:

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

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

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

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

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

进一步阅读:

【讨论】:

  • 也没有 tput edprintf '\033]J'konsole 工作。
  • tput edprintf '\033]J' 都没有在 st(无吸盘终端)工作。两个命令都简单地返回。在 xterm 中,printf '\033]J' 挂起。
  • 我不希望它起作用,因为那是 OSC J 而不是 CSI J。 xterm 按预期处理它。从这一点开始,关于 konsole 和 tput 的评论需要澄清一下(konsole 也可以按预期工作......)。
猜你喜欢
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 2016-04-22
相关资源
最近更新 更多