Очистить окно терминала в оболочке readline Node.js. - PullRequest
15 голосов
/ 11 января 2012

У меня есть простая оболочка 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 в узле или coffee REPL.

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

Ответы [ 7 ]

29 голосов
/ 11 января 2012

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

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-sequence-vt-100.php

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

Примечание

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

5 голосов
/ 04 января 2013

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

3 голосов
/ 22 июля 2014

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

Я искал здесь и там, и, кроме чудесного нажатия клавиши , естьбазовый модуль, который позволяет создавать 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))
});

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

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

2 голосов
/ 30 сентября 2015

Vorpal.js делает такие вещи действительно простыми.

Для интерактивного интерфейса командной строки с командой 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();
  });
2 голосов
/ 20 сентября 2015

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

var rl = require('readline');
rl.cursorTo(process.stdout, 0, 0);
rl.clearScreenDown(process.stdout);
2 голосов
/ 10 мая 2012

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

cli.on 'line', (line) ->
  if line == 'cls'
    console.log("\033[2J\033[0f")
  else
    console.log line
cli.prompt()
1 голос
/ 26 апреля 2015

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

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);
    }
  })()
})()
  • Первая строка гарантирует, что видимые линии всегда очищаются.

  • Вторая строка обеспечивает очистку истории прокрутки.

...