gpt4 book ai didi

ruby - 如何覆盖或编辑 ruby​​ CLI 脚本中最后打印的行?

转载 作者:数据小太阳 更新时间:2023-10-29 08:53:45 24 4
gpt4 key购买 nike

我正在尝试构建一个脚本,以便在命令行上提供有关进度的反馈。实际上,它只是为每第 n 个进展步骤添加一个换行符。控制台看起来像

10:30:00 Parsed 0 of 1'000'000 data entries (0 %)
10:30:10 Parsed 1'000 of 1'000'000 data entries (1 %)
10:30:20 Parsed 2'000 of 1'000'000 data entries (2 %)
[...] etc [...]
11:00:00 Parsed 1'000'000 of 1'000'000 data entries (100 %)

即使 timestamp 和 progressnumbers 是虚构的,您也应该看到问题所在。

我想要的是使用“wget 风格”在命令行上更新进度条,并考虑线宽。

首先,我想到了 curses 的使用,因为我在尝试学习 C 时已经动手了,但我从来没有对它感到满意,而且我认为它为了处理几行代码而显得臃肿。我也不需要任何着色。我发现的大多数其他库似乎也专门用于着色。

谁能帮我解决这个问题?

最佳答案

前一段时间我创建了一个类作为状态文本,您可以在其中更改行内文本的部分内容。它可能对您有用。

使用示例的类是:

class StatusText
def initialize(parms={})
@previous_size = 0
@stream = parms[:stream]==nil ? $stdout : parms[:stream]
@parms = parms
@parms[:verbose] = true if parms[:verbose] == nil
@header = []
@onChange = nil
pushHeader(@parms[:base]) if @parms[:base]
end

def setText(complement)
text = "#{@header.join(" ")}#{@parms[:before]}#{complement}#{@parms[:after]}"
printText(text)
end

def cleanAll
printText("")
end

def cleanContent
printText "#{@parms[:base]}"
end

def nextLine(text=nil)
if @parms[:verbose]
@previous_size = 0
@stream.print "\n"
end
if text!=nil
line(text)
end
end

def line(text)
printText(text)
nextLine
end

#Callback in the case the status text changes
#might be useful to log the status changes
#The callback function receives the new text
def onChange(&block)
@on_change = block
end

def pushHeader(head)
@header.push(head)
end

def popHeader
@header.pop
end

def setParm(parm, value)
@parms[parm] = value
if parm == :base
@header.last = value
end
end

private
def printText(text)
#If not verbose leave without printing
if @parms[:verbose]
if @previous_size > 0
#go back
@stream.print "\033[#{@previous_size}D"
#clean
@stream.print(" " * @previous_size)
#go back again
@stream.print "\033[#{@previous_size}D"
end
#print
@stream.print text
@stream.flush
#store size
@previous_size = text.gsub(/\e\[\d+m/,"").size
end
#Call callback if existent
@on_change.call(text) if @on_change
end
end

a = StatusText.new(:before => "Evolution (", :after => ")")

(1..100).each {|i| a.setText(i.to_s); sleep(1)}
a.nextLine

只需复制并粘贴到一个 ruby​​ 文件中并尝试一下。我使用转义序列来重新定位光标。

这个类有很多我当时需要的功能(比如在状态栏中堆积元素),你可以用它们来补充你的解决方案,或者你可以直接清理它的核心。

希望对你有帮助。

关于ruby - 如何覆盖或编辑 ruby​​ CLI 脚本中最后打印的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6677135/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com