nodejs - 类似Bash的标准输入

时间:2013-09-02 12:42:48

标签: node.js stdin

我想模仿bash输入行为(例如,按向上箭头访问输入历史记录,按Ctrl + C取消输入,按Ctrl + D退出)。

但是如果我想要转义箭头键(例如默认情况下被替换为^ [[A,^ [[B,^ [[C和^ [[D],我需要设置 raw模式打开,然后,每次按下键时都会触发输入事件。这很有用,但后来我需要对返回键或删除键等基本输入行为进行硬编码......

那么有没有办法,可能通过在stdin上管道流,以原始模式和非原始模式访问输入?

2 个答案:

答案 0 :(得分:3)

解决方案是readline模块(doc)。它提供输入历史记录,自动完成功能(在标签页上)等。

示例:

var readline = require('readline');

var rl = readline.createInterface({
    input : process.stdin,
    output : process.stdout,
});

function input (prompt, callback) {
    rl.question(prompt, function (res) {
        if (res === 'quit') rl.close();
        else callback(res);
    });
}

在doc

中给出了命令行界面的示例here

答案 1 :(得分:0)

您可能正在寻找的是本地TTY模块的rs.setRawMode(mode)。最初在Node v0.8.x中,keypress有一个未记录的process.stdin事件,当它是TTY时会发出。然后将其更改为仅在与readline一起使用时触发,因此我建议使用它。

该功能仍可由名为keypress的模块访问。它直接来自Node源,并且像这样使用(取自文档):

var keypress = require('keypress');

// make `process.stdin` begin emitting "keypress" events
keypress(process.stdin);

// listen for the "keypress" event
process.stdin.on('keypress', function (ch, key) {
  console.log('got "keypress"', key);
  if (key && key.ctrl && key.name == 'c') {
    process.stdin.pause();
  }
});

process.stdin.setRawMode(true);
process.stdin.resume();

它也被修改为支持您在GitHub页面上也可以找到的mousepress事件。