Як стерти символи, надруковані в консолі


77

Я шукав, як це зробити іншими мовами, і виявив, що мені потрібно використовувати спеціальний символ \ b, щоб видалити останній символ. ( how-do-i-erase-print-characters-in-a-console-applicationlinux )

Це не працює для node.js під час декількох викликів console.log ();

Якщо я пишу один журнал:

console.log ("abc\bd");

Отримую результат: abd

Але якщо я напишу:

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

Я отримую результат:

abc
d

Моя мета - надрукувати повідомлення, що очікує, наприклад:

Очікування
Очікування.
Чекаю ..
Чекаю ...

і знову:

Очікування
Очікування.
тощо

все в одному рядку.

Відповіді:


131

Є функції, доступні для 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);

Можна навести аргументи clearLine(direction, callback)

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

Оновлення 13 грудня 2015 року: хоча вищезазначений код працює, він більше не документується як частина process.stdin. Він переїхав доreadline


1
Я сподіваюся, що під капотом символ \ \ 'дозволяє це. Цей символ повертає курсор на початок рядка, не починаючи новий рядок.
Кейсі Уотсон,

Хоча не на вікнах.
Адам К Дін

7
@pimvdb Де ці функції задокументовані? Здається, їх немає в документах Node: nodejs.org/api/process.html#process_process_stdout
Генрі Мерріам,

5
Здається, це не працює на OSX, хтось знає, чи потрібно?
Знаркус,

1
Можливо, API змінено. Ця відповідь була написана два роки тому, і будь-який розробник JS повинен мати принаймні якесь уявлення про те, що змінилося за останні два роки. Ми перейшли від декількох мов компіляції до JS (найголовніше CoffeeScript) до транслірування найновішої версії, що виходить (що наближається до публікації), ES6. Два роки тому, якщо я правильно пам’ятаю, модулі ES6 навіть не існували.
Isiah Meadows


17

Найпростіший спосіб переписати один і той же рядок - це

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

\rє ключовим. Він перемістить курсор назад на початок рядка.


8
Єдина проблема з '\ r' полягає в тому, що він не очищає поточний рядок. Отже, якщо ви пишете "abcdefg \ r" вперше, а "zyxw \ r" наступного разу, ви отримаєте "zyxwefg".
docksteaderluke

Це правда, але в цьому випадку ви завжди повинні писати довший рядок, ніж той, що був раніше.
jonnysamps

8
Не у випадку з ОП.
docksteaderluke


0

Використання каретки

Символ повернення каретки ставить курсор назад на початок поточного рядка.

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

Це рішення спрацювало для мене - я протестував його лише з одним персонажем.


Повернення каретки тут неправильне, оскільки стирає весь рядок. Якщо ви заміните його \bу вашій відповіді, це спрацює. Крім того, переконайтеся, що ви оновили свій приклад, щоб хтось, хто його читає, відразу зрозумів ваш приклад (тут мені цікаво: чому б не спробувати стерти персонажа, щоб продемонструвати, що він працює належним чином?)
aymericbeaumet

-3

Спробуйте перемістити \ r на початку рядка, це працювало в Windows для мене:

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

1
Це не буде працювати - console.logдодає a \nдо кінця вашого рядка. Вам потрібно скористатисяprocess.stdout.write
Сетхі,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.