【问题标题】:Listen for command/ctrl + L signal in terminal监听终端中的 command/ctrl + L 信号
【发布时间】:2018-05-20 01:26:58
【问题描述】:

传统上,终端中的 command/ctrl +(小写 L)会清除它。

我可以使用 Node.js 将其写入标准输出来清除终端:

  process.stdout.write('\x1Bc');

但是我如何才能监听信号,特别是“command + l”组合键? (即小写 L)。

我认为 Node.js 的答案可能与: readline.emitKeypressEvents https://nodejs.org/api/readline.html#readline_readline_emitkeypressevents_stream_interface

【问题讨论】:

  • 我假设ctrl + l 代表终端的信号,但我找不到该信息:en.wikipedia.org/wiki/Signal_(IPC)
  • 其实 Ctrl+L 不是信号,更像是 readline 等库的“已知键绑定”。如果您无法使用 readline 模块或不编写交互式 shell,我会研究一下 termcaps 是什么。
  • 好吧,这就是我的想法,我怎么能捕捉到呢?
  • 我不太确定,因此我不写答案,但我认为它肯定涉及使用流的“原始模式”并肯定会根据 0x0c 检查按下的字符。
  • 是的,一般情况下,除非您按回车键或写一个换行符,否则 process.stdin 流的“数据”事件不会触发...不确定如何在那里捕获它

标签: node.js terminal signals stdout


【解决方案1】:

我挖掘了一下并编写了一个快速脚本作为概念证明。这是处理 Ctrl-C、Ctrl-D 和 Ctrl-L 信号并在新行上添加事件侦听器的示例,即使启用了原始模式。

#!/usr/bin/env node

process.stdin.currentLine = '';
process.stdin.setRawMode(true);

process.stdin.on('data', (buf) => {
    const charAsAscii = buf.toString().charCodeAt(0);

    switch (charAsAscii) {
        case 0x03:
            console.log('You pressed Ctrl-C. Sending SIGINT.')
            process.kill(process.pid, 'SIGINT');
            break;

        case 0x04:
            console.log('You pressed Ctrl-D. Bye!')
            process.exit(0);
            break;

        case 0x0c:
            console.log('You pressed Ctrl-L. Clearing screen.')
            break;

        case 0x0d:
            process.stdin.emit('line', process.stdin.currentLine);
            process.stdin.currentLine = '';
            break;

        default:
            process.stdin.currentLine += String.fromCharCode(charAsAscii);
            break;
    }
});

process.stdin.on('line', line => console.log(`New line: ${line}`));

它是如何工作的:

在原始模式下,输入始终是逐个字符可用的,不包括修饰符。此外,终端对字符的所有特殊处理都被禁用,包括回显输入字符。请注意,在此模式下,CTRL+C 将不再导致 SIGINT。

考虑到这一点,您可以转换在“数据”事件中获得的缓冲区,并检查它是 SIGINT (Ctrl-C)、“清除”命令 (Ctrl-L)、EOF (Ctrl- D),...

如果是普通字符,它只是将字符添加到内部缓冲区。当按下返回键时,会发出一个line 事件,并将内部缓冲区作为参数。然后,内部缓冲区被重置为空字符串。

【讨论】:

  • 知道如何监听tab 键吗?这是一个重要的
  • tab 应该是 0x09。我也忘了将它添加到我的示例中,但您必须处理del,即0x7f
猜你喜欢
  • 2023-04-01
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-09
  • 2011-10-09
  • 2021-10-08
相关资源
最近更新 更多