Как переопределить или отредактировать последние напечатанные строки в скрипте ruby ​​CLI? - PullRequest
2 голосов
/ 13 июля 2011

Я пытаюсь создать сценарий, который дает мне обратную связь о прогрессе в командной строке.На самом деле это просто ввод новой строки для каждого 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 %)

Даже если временная метка и номера прогресса являются вымышленными, вы должны увидеть проблему.

Я хочу сделать это "wget -стиль" с обновленной строкой прогрессав командной строке, с учетом ширины линии.

Сначала я подумал об использовании проклятий, потому что у меня были руки, когда я пытался выучить C, но я никогда не мог согреться с этим, также я думаю, что этораздутый с целью манипулирования всего несколькими строками.Также мне не нужны никакие раскраски.Также большинство других библиотек, которые я нашел, казалось, специализировались на раскраске.

Может кто-нибудь помочь мне с этой проблемой?

Ответы [ 3 ]

2 голосов
/ 13 июля 2011

Некоторое время назад я создал класс для текста статуса, в котором вы можете изменить часть содержимого текста в строке.Это может быть полезно для вас.

Класс с примером использования:

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 ​​и попробуйте его.Я использую escape-последовательности для изменения положения курсора.

В классе есть много функций, которые мне понадобились в то время (например, накапливание элементов в строке состояния), которые вы можете использовать для дополнения своего решения, или вы можете просто очиститьдо сути.

Надеюсь, это поможет.

1 голос
/ 28 ноября 2011

Тем временем я нашел несколько драгоценных камней, которые дают мне индикатор прогресса, я перечислю их здесь:

Я попробовал один из pgericson и тот из jfelchner , у них обоих есть свои плюсы и минусы, но оба они соответствуют моим потребностям. Вероятно, я раскошелюсь и расширю одну из них в будущем.

Надеюсь, этот поможет другим быстрее найти то, что я искал месяцами.

0 голосов
/ 13 июля 2011

Возможно, замените ваш вывод следующим:

print "Progress #{progress_var}%\r"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...