node.js coffeescript readline read-eval-print-loop

Borrar la ventana del terminal en el shell Readline de Node.js



coffeescript read-eval-print-loop (7)

Tengo una shell de lectura simple escrita en 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()

Al ejecutar esto, aparece un mensaje:

$ coffee cli.coffee hello>

Me gustaría poder presionar Ctrl-L para borrar la pantalla. es posible?

También me di cuenta de que no puedo presionar Ctrl-L en el REPL del nodo o del café tampoco.

Me estoy ejecutando en Ubuntu 11.04.


Puede borrar la pantalla con console.log() y secuencias de escape.

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


En el terminal MAC, para borrar la consola en NodeJS, simplemente presiona COMMAND+K como en Google Developer Tools Console, así que supongo que en Windows sería CTRL+K


Puede ver la pulsación de tecla usted mismo y borrar la pantalla.

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

El borrado se realiza con secuencias de control ASCII como las escritas aquí: http://ascii-table.com/ansi-escape-sequences-vt-100.php

El primer código /u001B[2J ordena al terminal que se borre solo, y el segundo /u001B[0;0f obliga al cursor a volver a la posición 0,0.

Nota

El evento de keypress ya no forma parte de la API de nodo estándar en el nodo >= 0.10.x pero puede utilizar el módulo de pulsación de tecla .


En respuesta a @loganfsmyth, comenten su respuesta (¡gracias por la edición!).

He estado buscando aquí y allá y, además del maravilloso módulo de pulsación de teclas , hay un módulo central que hace posible crear un cli con todo el comportamiento estándar del terminal (todo lo que damos por hecho hoy, como el historial, opciones para proporcionar un auto -la función completa y los eventos de entrada como la keypress están allí).

El módulo es readline ( documentación ). La buena noticia es que todo el comportamiento estándar ya está hecho para nosotros, así que no hay necesidad de adjuntar manejadores de eventos (es decir, historial, borrar la pantalla con Ctrl + L , hombre si proporcionó la función de autocompletar estará en la pestaña de presionar )

Solo como un ejemplo

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)) });

Muy buen descubrimiento.

La versión de nodo que estoy usando es v0.10.29 . He estado mirando el registro de cambios y estaba allí desde 2010 (commit 10d8ad ).


Pruebe también:

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


Vorpal.js hace cosas como esta realmente fáciles.

Para una CLI interactiva con un comando clear así como una REPL dentro del contexto de su aplicación, haga esto:

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(); });


Esta es la única respuesta que borrará la pantalla Y el historial de desplazamiento.

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); } })() })()

  • La primera línea garantiza que las líneas visibles siempre se borren.

  • La segunda línea garantiza que el historial de desplazamiento se borre.