So löschen Sie in der Konsole gedruckte Zeichen


76

Ich habe gesucht, wie es in anderen Sprachen gemacht wird, und festgestellt, dass ich das Sonderzeichen \ b verwenden muss, um das letzte Zeichen zu entfernen. ( Wie-lösche ich-gedruckte-Zeichen-in-einer-Konsole-Applicationlinux )

Dies funktioniert nicht für node.js bei mehreren Aufrufen von console.log ().

Wenn ich ein einzelnes Protokoll schreibe:

console.log ("abc\bd");

Ich bekomme das Ergebnis: abd

Aber wenn ich schreibe:

console.log ("abc");
console.log ("\bd");

Ich bekomme das Ergebnis:

abc
d

Mein Ziel ist es, eine wartende Nachricht zu drucken wie:

Warten
Warten.
Warten ..
Warten ...

und wieder:

Warten
Warten.
etc

alle in der gleichen Zeile.

Antworten:


131

Es stehen Funktionen zur Verfügung für process.stdout:

var i = 0;  // dots counter
setInterval(function() {
  process.stdout.clearLine();  // clear current text
  process.stdout.cursorTo(0);  // move cursor to beginning of line
  i = (i + 1) % 4;
  var dots = new Array(i + 1).join(".");
  process.stdout.write("Waiting" + dots);  // write text
}, 300);

Es ist möglich, Argumente zu liefern clearLine(direction, callback)

/**
 * -1 - to the left from cursor
 *  0 - the entire line // default
 *  1 - to the right from cursor
 */

Update 13. Dezember 2015: Obwohl der obige Code funktioniert, ist er nicht mehr als Teil von dokumentiert process.stdin. Es ist umgezogenreadline


1
Ich gehe davon aus, dass der Charakter '\ r' dies unter der Haube ermöglicht. Dieses Zeichen setzt den Cursor an den Zeilenanfang zurück, ohne eine neue Zeile zu beginnen.
Casey Watson

Nicht unter Windows.
Adam K Dean

7
@pimvdb Wo sind diese Funktionen dokumentiert? Sie scheinen nicht in den Knotendokumenten enthalten zu sein: nodejs.org/api/process.html#process_process_stdout
Henry Merriam

5
Dies scheint unter OSX nicht zu funktionieren. Weiß jemand, ob es sollte?
Znarkus

1
Möglicherweise wurde die API geändert. Diese Antwort wurde vor zwei Jahren geschrieben, und jeder JS-Entwickler sollte zumindest eine Vorstellung davon haben, wie viel sich in den letzten zwei Jahren geändert hat. Wir sind von einigen Compile-to-JS-Sprachen (insbesondere CoffeeScript) zur Transpilierung der neuesten Version (ES6) übergegangen. Wenn ich mich recht erinnere, gab es vor zwei Jahren noch nicht einmal ES6-Module.
Isiah Meadows


17

Der einfachste Weg, dieselbe Zeile zu überschreiben, ist

var dots = ...
process.stdout.write('Progress: '+dots+'\r');

Das \rist der Schlüssel. Der Cursor bewegt sich zurück zum Zeilenanfang.


8
Das einzige Problem mit '\ r' ist, dass die aktuelle Zeile nicht gelöscht wird. Wenn Sie also das erste Mal "abcdefg \ r" und das nächste Mal "zyxw \ r" schreiben, erhalten Sie "zyxwefg".
Docksteaderluke

Das stimmt, aber in diesem Fall sollten Sie immer eine längere Zeile als die vorherige schreiben.
Jonnysamps

8
Nicht im Fall des OP.
Docksteaderluke

2

Das funktioniert bei mir:

process.stdout.write('\033c');
process.stdout.write('Your text here');

0

process.stdout.write("\r");

Arbeitete für mich (nur mit einem einzelnen Charakter getestet)


Carriage Return ist hier falsch, da die gesamte Zeile gelöscht wird. Wenn Sie es \bin Ihrer Antwort durch ersetzen, funktioniert es. Stellen Sie außerdem sicher, dass Sie Ihr Beispiel aktualisieren, damit jemand, der es liest, Ihr Beispiel sofort verstehen kann (hier frage ich mich: Warum nicht versuchen, ein Zeichen zu löschen, um zu demonstrieren, dass es richtig funktioniert?)
aymericbeaumet

-3

Versuchen Sie, indem Sie das \ r am Anfang der Zeichenfolge verschieben. Dies funktionierte unter Windows für mich:

for (var i = 0; i < 10000; i+=1) {
    setTimeout(function() {
        console.log(`\r ${i}`);
    }, i);
}

1
Dies funktioniert nicht - console.logfügt \nam Ende Ihrer Zeichenfolge ein hinzu. Sie müssen verwendenprocess.stdout.write
Sethi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.