我有一个用Coffeescript编写的简单的readline shell:
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
来清除屏幕。这可能吗?
我也注意到我无法在节点或咖啡 REPL中点击Ctrl-L
。
我在Ubuntu 11.04上运行。
答案 0 :(得分:29)
您可以自己观看按键并清除屏幕。
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
事件不再是节点>= 0.10.x
中标准Node API的一部分,但您可以使用keypress模块。
答案 1 :(得分:5)
在MAC终端中,要清除NodeJS中的控制台,您只需点击COMMAND+K
就像在Google Developer Tools Console中一样,所以我猜测在Windows上它会是CTRL+K
。
答案 2 :(得分:3)
回复@loganfsmyth评论他的答案(感谢编辑!)。
我一直在寻找这里和那里,除了精彩的keypress模块之外,还有一个核心模块可以创建一个具有所有标准终端行为的cli
(我们提供的所有内容)今天授予历史记录,提供自动完成功能的选项以及keypress
等输入事件。
该模块为readline
(documentation)。好消息是所有标准行为已经为我们完成,所以不需要附加事件处理程序(即历史记录,清除屏幕上的 Ctrl + L ,man如果你提供了自动完成功能,它将在 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))
});
真的很好发现。
答案 3 :(得分:2)
您可以使用console.log()
和转义序列清除屏幕。
cli.on 'line', (line) ->
if line == 'cls'
console.log("\033[2J\033[0f")
else
console.log line
cli.prompt()
答案 4 :(得分:2)
Vorpal.js让这样的事情变得非常简单。
对于在应用程序上下文中具有clear
命令和REPL的交互式CLI,请执行以下操作:
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();
});
答案 5 :(得分:1)
这是唯一可以清除屏幕 AND 滚动历史记录的答案。
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);
}
})()
})()
第一行确保始终清除可见行。
第二行确保清除滚动历史记录。