【问题标题】:nodejs - Bash-like stdinnodejs - 类似 Bash 的标准输入
【发布时间】:2013-09-05 14:03:34
【问题描述】:

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

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

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

【问题讨论】:

标签: node.js stdin


【解决方案1】:

您可能正在寻找的是用于本机 TTY 模块的 rs.setRawMode(mode)。最初在 Node v0.8.x 中,process.stdin 有一个未记录的 keypress 事件,当它是 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 事件。

【讨论】:

  • 但如果 raw 模式 开启,则每次按键都会触发 stdin 的 data 事件,并且特殊键,如返回、删除或左右箭头是不再处理。
  • keypress 模块也处理这些键。
【解决方案2】:

解决方案是 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);
    });
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多