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.