【问题标题】:Clear terminal window in Node.js readline shell在 Node.js readline shell 中清除终端窗口
【发布时间】:2012-02-07 10:43:52
【问题描述】:

我有一个用 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 来清除屏幕。这可能吗?

我还注意到我无法在 nodecoffee REPL 中点击 Ctrl-L

我在 Ubuntu 11.04 上运行。

【问题讨论】:

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


    【解决方案1】:

    您可以自己观察按键并清除屏幕。

    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 事件不再是 Node >= 0.10.x 中标准 Node API 的一部分,但您可以改用 keypress 模块。

    【讨论】:

    • 这需要一个'\u001B[0;0f' 在擦除后,但现在就像一个魅力。谢谢。
    • 不知道这个存在!我差点为这看起来有多漂亮而哭泣 x')
    • 我在 0.8.x 之后被删除。我想太多冗长了。
    • @stringparser 见我的笔记。
    • @loganfsmyth 谢谢!我还发现这在corereadline 上可用。留下答案! :)
    【解决方案2】:

    在 MAC 终端中,要清除 NodeJS 中的控制台,您只需点击 COMMAND+K,就像在 Google 开发者工具控制台中一样,所以我猜在 Windows 上它会是 CTRL+K

    【讨论】:

    • 我认为他的意思是以编程方式清除控制台,而不是通过用户输入。
    • 有没有办法从 Node 以编程方式触发COMMMAND+K
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      在回复@loganfsmyth 对他的回答发表评论时(感谢您的编辑!)。

      我一直在到处寻找,除了美妙的keypress 模块之外,还有一个核心模块可以创建具有所有标准终端行为的cli(我们今天认为理所当然的所有东西,例如历史记录、提供自动完成功能的选项和输入事件(例如keypress)。

      模块是readline (documentation)。好消息是我们已经完成了所有标准行为,因此无需附加事件处理程序(即历史记录,在 Ctrl+L 上清除屏幕,man如果您提供了自动完成功能,它将在 Tabpress 上)。

      举个例子

      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)。

      【讨论】:

        【解决方案5】:

        也可以试试:

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

        【讨论】:

          【解决方案6】:

          您可以使用console.log() 和转义序列清除屏幕。

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 2016-02-07
              • 2013-10-21
              • 2019-04-22
              • 1970-01-01
              • 1970-01-01
              • 2013-10-05
              • 1970-01-01
              • 2020-01-07
              • 2019-11-11
              相关资源
              最近更新 更多