Frage

Wenn Sie git clone ausführen, aktualisiert er die Fortschritte an seinem Platz. Zum Beispiel Änderungen an Ort und Stelle erhielt der Anteil der Objekte.

user@athena:~/cloj/src$ git clone git://git.boinkor.net/slime.git
Initialized empty Git repository in /home/user/cloj/src/slime/.git/
remote: Counting objects: 15936, done.
remote: Compressing objects: 100% (5500/5500), done.
Receiving objects:  28% (4547/15936), 3.16 MiB | 165 KiB/s

Wie wird diese acccomplished? Ist es verwendet ncurses oder etwas noch einfacher, wie eine Kombination aus Backspace Zeichen und regelmäßiger Zeichenausgabe?

Ich bin besonders daran interessiert, wie diese Art der Konsolenausgabe von Ruby erreicht werden könnte.

EDIT

ist meine ursprüngliche Frage beantwortet. Aber hier ist ein Nachtrag. Wenn Sie MPlayer verwenden, zum Beispiel, ist es nicht nur aktualisiert eine Zeile aktuellen Fortschritt zu zeigen, sondern auch die zurück Linie (zum Beispiel, wenn Sie Pause drücken).

 =====  PAUSE  =====
A:  79.9 (01:19.9) of 4718.0 ( 1:18:38.0)  0.3% 

Wie würden Sie zwei Zeilen der Ausgabe aktualisieren an Ort und Stelle?

War es hilfreich?

Lösung

Verwenden Sie Wagenrücklauf. '\ R' sollte in der Regel arbeiten.

Andere Tipps

git / progress.c

...
        eol = done ? done : "   \r";
...
                fprintf(stderr, "...%s", ..., eol);
                fflush(stderr);

Git aussendet einfach einen Wagenrücklauf und Zeilenvorschub keine, die das Endgerät interpretiert als „Verschieben zum ersten Spalte“.

Sie werden eine andere Methode verwenden (wie Flüche) zwei Linien an Ort und Stelle zu aktualisieren.

ablogaboutcode.com | web.archive.org

... und ...

http: //www.ruby -doc.org/stdlib-1.9.3/libdoc/curses/rdoc/Curses.html

Ich schrieb wenig Klasse für mehrzeilige Ausgabe Update:

class ConsoleReset
  # Unix
  # Contains a string to clear the line in the shell
  CLR = "\e[0K"
  # ANSI escape sequence for hiding terminal cursor
  ESC_CURS_INVIS = "\e[?25l"
  # ANSI escape sequence for showing terminal cursor
  ESC_CURS_VIS   = "\e[?25h"
  # ANSI escape sequence for clearing line in terminal
  ESC_R_AND_CLR  = "\r#{CLR}"
  # ANSI escape sequence for going up a line in terminal
  ESC_UP_A_LINE = "\e[1A"

  def initialize
    @first_call = true
  end

  def reset_line(text = '')
    # Initialise ANSI escape string
    escape = ""

    # The number of lines the previous message spanned
    lines = text.strip.lines.count - 1

    # Clear and go up a line
    lines.times { escape += "#{ESC_R_AND_CLR}#{ESC_UP_A_LINE}" }

    # Clear the line that is to be printed on
    # escape += "#{ESC_R_AND_CLR}"

    # Console is clear, we can print!
    STDOUT.print escape if !@first_call
    @first_call = false
    print text
  end

  def hide_cursor
    STDOUT.print(ESC_CURS_INVIS)
  end

  def show_cursor
    STDOUT.print(ESC_CURS_VIS)
  end

  def test
    hide_cursor

    5.times do |i|
      line = ['===========================================']
      (1..10).each do |num|
        line << ["#{num}:\t#{rand_num}"]
      end
      line << ['===========================================']
      line = line.join("\n")
      reset_line(line)
      sleep 1
    end

    show_cursor

    puts ''
  end

  private
    def rand_num
      rand(10 ** rand(10))
    end
end

Inspiriert von prydonius/spinning_cursor . Siehe test Verfahren zum Beispiel Nutzung.

Es gibt eine Reihe von Flüchen librbaries für Ruby. Ich glaube, rbbcurse ist das beibehalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top