Wyczyść okno terminala w węźle.js readline shell

Mam prostą powłokę readline napisaną w 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()

Uruchomienie tego wyświetla monit:

$ coffee cli.coffee 
hello> 
Chciałbym móc uderzyć Ctrl-L, aby wyczyścić ekran. Czy to możliwe?

Zauważyłem też, że nie mogę trafić Ctrl-L ani w } węzeł , ani w kawa .

Działam na Ubuntu 11.04.

Author: mkopala, 2012-01-11

7 answers

Możesz sam obserwować naciśnięcie klawisza i wyczyścić ekran.

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

Czyszczenie odbywa się za pomocą sekwencji sterujących ASCII, takich jak te napisane tutaj: http://ascii-table.com/ansi-escape-sequences-vt-100.php

Pierwszy kod \u001B[2J nakazuje terminalowi samoczynne wyczyszczenie, a drugi \u001B[0;0f wymusza powrót kursora do pozycji 0,0.

Uwaga

Zdarzenie keypress nie jest już częścią standardowego API węzła w Node >= 0.10.x, ale można użyć klawiatura Moduł zamiast.

 29
Author: loganfsmyth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-22 14:46:39

W terminalu MAC, aby wyczyścić konsolę w NodeJS, wystarczy nacisnąć COMMAND+K tak jak w konsoli Google Developer Tools, więc zgaduję, że na Windows będzie to CTRL+K.

 5
Author: Adrian Oprea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-04 13:34:10

On response to @ loganfsmyth comment on his answer (thanks for the edit!).

Szukałem tu i ówdzie i oprócz cudownego modułu Klawiatura , istnieje moduł podstawowy, który umożliwia stworzenie {[1] } ze wszystkimi standardowymi zachowaniami terminala(wszystkie rzeczy, które dziś dajemy za pewnik, takie jak historia, opcje automatycznego uzupełniania funkcji i zdarzenia wejściowe, takie jak keypress są tam).

Moduł jest readline (dokumentacja ). Dobre wieści czy wszystkie standardowe zachowanie jest już zrobione dla nas, więc nie ma potrzeby dołączania programów obsługi zdarzeń (np. historia, Czyszczenie ekranu na Ctrl+L, man jeśli podałeś funkcję auto complete to będzie na zakładce naciśnij).

Jako przykład

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))
});
Naprawdę dobre odkrycie.

Używana przeze mnie Wersja węzła to v0.10.29. Patrzyłem na changelog i był tam od 2010 roku (commit 10d8ad).

 3
Author: stringparser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-28 22:45:54

Możesz wyczyścić ekran za pomocą console.log() i sekwencji specjalnych.

cli.on 'line', (line) ->
  if line == 'cls'
    console.log("\033[2J\033[0f")
  else
    console.log line
cli.prompt()
 2
Author: nephilim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-10 02:35:07

Spróbuj też:

var rl = require('readline');
rl.cursorTo(process.stdout, 0, 0);
rl.clearScreenDown(process.stdout);
 2
Author: vsemozhetbyt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-19 21:00:10

Vorpal.js sprawia, że takie rzeczy są naprawdę łatwe.

W przypadku interaktywnego CLI z poleceniem clear oraz REPL w kontekście aplikacji, wykonaj następujące czynności:

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
Author: dthree,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-30 16:47:42

Jest to jedyna odpowiedź, która wyczyści ekran I Historia przewijania.

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);
    }
  })()
})()
  • Pierwsza linia zapewnia, że widoczne linie są zawsze wyczyszczone.

  • Druga linia zapewnia wyczyszczenie historii przewijania.

 1
Author: aleclarson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-26 20:36:57