Очистить окно терминала в Node.js оболочке readline

У меня есть простая оболочка readline, написанная в Coffeescript:

rl = require 'readline'
cli = rl.createInterface process.stdin, process.stdout, null
cli.setPrompt "hello> "

cli.on 'line', (line) ->
  console.log line
  cli.prompt()

cli.prompt()

Запустив это, вы увидите приглашение:

$ coffee cli.coffee 
hello> 

Я хотел бы иметь возможность ударить Ctrl-L, чтобы очистить экран. Возможно ли это?

Я также заметил, что я не могу нажать Ctrl-L в обоих node или кофе.

Я работаю на Ubuntu 11.04.

Ответы

Ответ 1

Вы можете следить за нажатием клавиши и очищать экран.

process.stdin.on 'keypress', (s, key) ->
  if key.ctrl && key.name == 'l'
    process.stdout.write '\u001B[2J\u001B[0;0f'

Очистка выполняется с помощью управляющих последовательностей ASCII, таких как: http://ascii-table.com/ansi-escape-sequences-vt-100.php

Первый код \u001B[2J инструктирует терминал очистить себя, а второй \u001B[0;0f заставляет курсор вернуться в положение 0,0.

Примечание

Событие keypress больше не является частью стандартного API Node в Node >= 0.10.x, но вы можете использовать keypress модуль.

Ответ 2

В терминале MAC, чтобы очистить консоль в NodeJS, вы просто нажмите COMMAND+K, как в консоли Google Developer Tools, поэтому я предполагаю, что в Windows это будет CTRL+K.

Ответ 3

В ответ на комментарий @loganfsmyth о его ответе (спасибо за редактирование!).

Я смотрел здесь и там, и кроме замечательного keypress модуля, есть основной модуль, который позволяет создавать a cli со всем стандартным поведением терминала (все, что мы даем сегодня, например история, опции для обеспечения функции автозаполнения и входных событий, таких как keypress).

Модуль readline (документация). Хорошей новостью является то, что все стандартное поведение уже сделано для нас, поэтому нет необходимости присоединять обработчики событий (например, историю, очищая экран от Ctrl + L), если вы предоставили функцию автозаполнения, она будет нажмите Tab нажмите).

Как пример

var readline = require('readline')
  , cli = readline.createInterface({
      input : process.stdin,
      output : process.stdout
  });

var myPrompt = ' > myPropmt '
cli.setPrompt(myPrompt, myPrompt.length); 
// prompt length so you can use "color" in your prompt
cli.prompt(); 
// Display ' > myPrompt ' with all standard features (history also!)

cli.on('line', function(cmd){ // fired each time the input has a new line       
   cli.prompt();
})

cli.input.on('keypress', function(key){  // self explanatory
  // arguments is a "key" object
  // with really nice properties such as ctrl : false
  process.stdout.write(JSON.stringify(arguments))
});

Действительно хорошее открытие.

Используемая версия node - v0.10.29. Я смотрел changelog, и он был там с 2010 года (commit 10d8ad).

Ответ 4

Попробуйте также:

var rl = require('readline');
rl.cursorTo(process.stdout, 0, 0);
rl.clearScreenDown(process.stdout);

Ответ 5

Vorpal.js делает такие вещи очень легкими.

Для интерактивного CLI с командой clear, а также REPL в контексте вашего приложения сделайте следующее:

var vorpal = require('vorpal')();
var repl = require('vorpal-repl');

vorpal
  .delimiter('hello>')
  .use(repl)
  .show();

vorpal
  .command('clear', 'Clears the screen.')
  .action(function (args, cb) {
    var blank = '';
    for (var i = 0; i < process.stdout.rows; ++i) {
      blank += '\n';
    }
    vorpal.ui.rewrite(blank);
    vorpal.ui.rewrite('');
    cb();
  });

Ответ 6

Вы можете очистить экран, используя console.log() и escape-последовательности.

cli.on 'line', (line) ->
  if line == 'cls'
    console.log("\033[2J\033[0f")
  else
    console.log line
cli.prompt()

Ответ 7

Это единственный ответ, который очистит историю прокрутки экрана И.

function clear() {
  // 1. Print empty lines until the screen is blank.
  process.stdout.write('\033[2J');

  // 2. Clear the scrollback.
  process.stdout.write('\u001b[H\u001b[2J\u001b[3J');
}

// Try this example to see it in action!
(function loop() {
  let i = -40; // Print 40 lines extra.
  (function printLine() {
    console.log('line ' + (i + 41));
    if (++i < process.stdout.columns) {
      setTimeout(printLine, 40);
    }
    else {
      clear();
      setTimeout(loop, 3000);
    }
  })()
})()
  • Первая строка гарантирует, что видимые строки всегда очищаются.

  • Вторая строка гарантирует, что история прокрутки будет удалена.