Node.js: impression à la console sans une fuite de saut de ligne?
Est-il une méthode pour l'impression à la console sans une fuite de saut de ligne? Le console
objet la documentation ne dit rien au sujet que:
console.log()
Imprime sur la sortie standard avec retour à la ligne. Cette fonction peut prendre plusieurs arguments dans un
printf()
-comme moyen. Exemple:console.log('count: %d', count);
Si le formatage des éléments ne se trouvent pas dans la première corde puis
util.inspect
est utilisé sur chaque argument.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
process.stdout.write()
:Voir le docs pour plus de détails.
console.log
l'impression de\n
littéralement quand j'ai voulu imprimer un caractère de saut de ligne.` followed by an
n`, quand j'ai voulu la sortie d'un réel caractère de saut de ligne.Aussi, si vous souhaitez remplacer les messages dans la même ligne, par exemple dans un compte à rebours, vous pouvez ajouter '\r' à la fin de la chaîne.
process.stdout.write("Downloading " + data.length + " bytes\033[0G");
\033
avec le hex littérale\x1b
comme ceci:\x1b[0G
. (qui fonctionne à la fois strict et non-strict code).write("goodbye\r")
suivie par.write("hi\r")
résultats danshiodbye
''.padEnd(str.length)
où str est votre chaîne d'origine à remplacer, puis faire votrehello
..write("\x1b[0G\x1b[K");
. Ou sans changement de la position du curseur.write("\x1b[2K")
.Dans la console Windows (Linux, trop de), vous devez remplacer '\r' avec son équivalent en code \033[0 G:
Il utilise un terminal VT220 séquence d'échappement pour envoyer le curseur sur la première colonne.
[\] 39
et le curseur est mis en évidence sur le premier char:var spinner = '|/-\\'.split('');process.stdout.write("["+this.randomElement(spinner)+"] "+message+"\033[0G");
man console_codes
(sur Linux ou en ligne) et mon préféré de référence est www2.phys.canterbury.ac.nz/dept/docs/manuels/unix/DEC_4.0e_Docs/... (99% de son contenu encore du travail). Seul inconvénient: Être en mesure de tester toutes les expériences sur plusieurs terminaux différents avant de déployer largement.util.imprimer peut être également utilisé. Lire: http://nodejs.org/api/util.html#util_util_print
Un exemple:
util.print
est obsolète maintenant(node:7616) DeprecationWarning: util.print is deprecated. Use console.log instead.
Comme une extension/amélioration de la brillante plus faite par @rodowi ci-dessus quant à être en mesure de remplacer une ligne:
Si vous ne voulez pas le terminal curseur est situé sur le premier caractère, comme je l'ai vu dans mon code, l'envisager de prendre les mesures suivantes:
En plaçant le
\r
en face de la prochaine instruction print le curseur est réinitialisé juste avant le remplacement de la chaîne remplace la précédente.Il semble y avoir beaucoup de réponses suggérant
process.stdout.write
. Les journaux d'erreur doit être affiché surprocess.stderr
à la place (Utilisationconsole.error
). Pour ceux qui se demandent pourquoi le processus.la sortie standard stdout.write('\033[0 G'); ne pas faire quelque chose, c'est parce que stdout est mis en mémoire tampon et vous avez besoin d'attendre pourdrain
événement (Voir Flush Stdout pour NodeJS?). Si l'écriture renvoie la valeur false, cela va déclencher unedrain
événement.Aucune de ces solutions ne fonctionne pour moi. processus.la sortie standard stdout.write('ok\033[0 G') et juste en utilisant "\r " il suffit de créer une nouvelle ligne, ne pas écraser, Mac OSX 10.9.2
EDIT: j'ai eu à l'utiliser pour remplacer l'actuelle ligne
processus.la sortie standard stdout.write('\033[0 G');
processus.la sortie standard stdout.write('newstuff');
J'ai eu une erreur lors de l'utilisation en mode strict.
Nœud d'erreur: "Octal littéraux ne sont pas autorisés en mode strict."
J'ai trouvé la réponse ici:
https://github.com/SBoudrias/Inquirer.js/issues/111
processus.la sortie standard stdout.write("received:" + octetsreçus + "\x1B[0G");