【问题标题】:\r doesn't clear more than one line\r 不会清除超过一行
【发布时间】:2015-10-14 16:31:45
【问题描述】:

假设我的终端是 4 列宽,我打印 4 Xs 和一个返回字符:

$ print "XXXX\r"
$ yesyeshellothiscanbeanythig

\r 返回到行首,以便后面的字符 (yesyeshellothiscanbeanythig) 可以覆盖它们。

我想在单行之外实现这种效果:当我有五个 X 并且最后一个 X 换行到第二行时,我希望 \r 移回两行。

我想要什么:

$ print "XXXX\r"
$ overwrite

我得到了什么:

$ print "XXXXX\r"
XXXX
$ overwrite

打印前 4 个 Xs,然后将第五个 X 换行,然后 \r 仅转到第二行的开头,而将 4 个 X 原封不动地留在第一行。

有没有平台无关的方式让\r回到第一行的开头?我认为\r 会出现在第一行的开头,如果这些行是通过换行而不是显式的\n 生成的。

【问题讨论】:

  • 你的问题看似简单易懂(不一定是容易解决的意思),但你写的好像很难。
  • 再次换行的方式/原因是什么?
  • 在“我想要什么”下,为什么会有$ print "XXXX\r"

标签: ruby terminal


【解决方案1】:

\r,根据定义,只将光标移动到当前行的开头。 没有标准的方式将光标移动到其他行 - 不同的平台有不同的方式来做到这一点。在 Windows 上,您将使用 Win32 控制台 API 来移动光标,而在 Linux/UNIX/OS X 上,您将使用 ANSI 转义码来移动光标。

Ruby Curses 库可以做到这一点,但我不确定它是否适用于 Windows,例如。

【讨论】:

  • 我不确定这是否记录在某处,但当前版本的 MRI 在写入控制台时支持 Windows 上的一些 ANSI 转义码。
  • 实际上,ECMA-48(相关标准)中的“定义”比这更复杂。它使光标(活动演示位置)转到同一行上的 home 位置。起始位置是可配置的(尽管很少使用给定的 SLH 序列)。一些终端有可设置的边距——回车会受这些影响。
猜你喜欢
  • 1970-01-01
  • 2023-01-10
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 2016-11-04
相关资源
最近更新 更多