2

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

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

那么有没有办法,也许通过在标准输入上管道流,以原始模式和非原始模式访问输入?

4

2 回答 2

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

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

于 2013-09-02T13:52:26.203 回答
0

您可能正在寻找的是rs.setRawMode(mode)原生TTY模块。最初在 Node v0.8.x 中,当它是 TTY 时会发出一个未记录的keypress事件。process.stdin然后将其更改为仅在与 一起使用时触发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();

它也进行了更改,以支持mousepress您也可以在 GitHub 页面上找到的事件。

于 2013-09-03T02:35:15.570 回答