47 votes

Comment écraser une ligne imprimée dans le shell avec Ruby ?

Comment écraser la ligne précédemment imprimée dans un shell Unix avec Ruby ?

Disons que j'aimerais afficher l'heure actuelle sur un shell toutes les secondes, mais au lieu d'empiler chaque chaîne de temps, j'aimerais écraser l'heure précédemment affichée.

83voto

cam Points 8882

Vous pouvez utiliser la \r à la fin de la ligne (la ligne suivante écrasera cette ligne). En suivant ton exemple :

 require 'time'

loop do
  time = Time.now.to_s + "\r"
  print time
  $stdout.flush
  sleep 1
end

37voto

jsegal Points 921

Utilisez la séquence d'échappement \r à la fin de la ligne - c'est un retour chariot sans saut de ligne .

Sur la plupart des terminaux Unix, cela fera ce que vous voulez : la ligne suivante écrasera la ligne précédente.

Vous voudrez peut-être remplir la fin de vos lignes avec des espaces si elles sont plus courtes que les lignes précédentes.

Notez que ce n'est pas spécifique à Ruby. Cette astuce fonctionne dans n'importe quelle langue !

1voto

Saloaty Points 32

Voici un exemple que je viens d'écrire qui prend un tableau et génère des espaces blancs si nécessaire. Vous pouvez décommenter la variable de vitesse pour contrôler la vitesse au moment de l'exécution. Supprimez également l'autre sleep 0.2 La dernière partie du tableau doit être vide pour afficher l'ensemble du tableau, tout en continuant à le réparer.

 #@speed = ARGV[0]

strArray = [ "First String there are also things here to backspace", "Second Stringhereare other things too ahdafadsf", "Third String", "Forth String", "Fifth String", "Sixth String", " " ]


#array = [ "/", "-", "|", "|", "-", "\\", " "]

def makeNewLine(array)
    diff = nil
    print array[0], "\r"
    for i in (1..array.count - 1)
        #sleep @speed.to_f
        sleep 0.2
        if array[i].length < array[i - 1].length
             diff = array[i - 1].length - array[i].length
        end
        print array[i]
        diff.times { print " " } if !diff.nil?
        print "\r"
        $stdout.flush

    end
end

20.times { makeNewLine(strArray) }

#20.times { makeNewLine(array)}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X