Question

Lorsque vous exécutez git clone, il met à jour des progrès en place. Par exemple, le pourcentage des objets reçus en place des changements.

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

Comment est-ce acccomplished? Est-il utiliser ncurses ou quelque chose d'encore plus simples, comme une combinaison de caractères Backspace et la sortie régulière de caractères?

Je suis particulièrement intéressé par la façon dont ce type de sortie de la console pourrait être réalisée à partir de Ruby.

EDIT

Ma question originale réponse. Mais voici un additif. Lorsque vous utilisez MPlayer, par exemple, il met à jour non seulement une ligne pour montrer les progrès en cours, mais aussi les précédente ligne (par exemple lorsque vous appuyez sur pause).

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

Comment voulez-vous mettre à jour deux lignes de production en place?

Était-ce utile?

La solution

Utilisez retour chariot. '\ R' devrait normalement fonctionner.

Autres conseils

git / progress.c

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

Git émet simplement un retour chariot et aucun saut de ligne, auquel le terminal interprète comme « déplacer à la première colonne ».

Vous devrez utiliser une autre méthode (comme Curses) de mettre à jour deux lignes en place.

ablogaboutcode.com | web.archive.org

... et ...

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

J'ai écrit peu classe pour la mise à jour de sortie multiligne:

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

Inspiré par prydonius/spinning_cursor . Voir méthode test par exemple l'utilisation.

Il y a un certain nombre de bibliothèques de malédictions pour Ruby. Je crois que la malédiction de RBB est le plus maintenu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top