在控制台实现原地进度输出:如何清空当前行

4

我有一个Ruby脚本,使用回车符在同一行输出进度消息,像这样:

print "\r#{file_name} processed."

作为一个例子,输出从"file001.html处理."变成了"file002.html.处理",直到脚本完成。
我想用"完成。"来替换最后的进度信息,但我不能只写print "\rDone.",因为那段代码会输出类似于这样的内容:
Done.99.html processed.

我猜我需要在最后一个进度消息之后清空行,然后打印 Done。。我该怎么做?


2
为什么你不在“完成”后打印很多空格呢? - Sergio Tulentsev
@SergioTulentsev 因为一些终端实际上会进行换行。 - Reactormonk
1个回答

7

在使用\r之后,您需要发送与终端信息变量clr_eol(能力名称el)对应的字节序列。有几种方法可以做到这一点。

最简单的方法是假设存在一个常量值。在我检查过的终端上,它是\e[K,但我只检查了几个。在这两个终端上,以下操作有效:

clear = "\e[K"
print "foo 123"
print "\r#{clear}bar\n"

您也可以使用以下方法获取该值:
clear = `tput el` 

或者您可以使用 terminfo gem

require 'terminfo'
clear = TermInfo.control_string 'el'

tput命令不可用的情况下(例如Windows),clear = \tput el``无法正常工作。 - Miscreant
显然不会。不能完全依赖它可用是我提供其他替代方案的原因之一。 - qqx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接