清除Node.js readline shell中的终端窗口

时间:2012-01-11 01:46:52

标签: node.js coffeescript readline read-eval-print-loop

我有一个用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上运行。

6 个答案:

答案 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等输入事件。

该模块为readlinedocumentation)。好消息是所有标准行为已经为我们完成,所以不需要附加事件处理程序(即历史记录,清除屏幕上的 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))
});

真的很好发现。

我使用的节点版本是v0.10.29。我一直在关注changelog,它自2010年以来一直存在(提交10d8ad)。

答案 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);
    }
  })()
})()
  • 第一行确保始终清除可见行。

  • 第二行确保清除滚动历史记录。