在终端中监听命令/控制+ L信号

时间:2018-05-20 01:26:58

标签: node.js terminal signals stdout

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

我可以使用Node.js清除终端,将其写入stdout:

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

但是我怎么能专门听“命令+ l”组合键的信号呢? (这是一个小写的L)。

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

1 个答案:

答案 0 :(得分: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事件,并将内部缓冲区作为参数。然后,内部缓冲区重置为空字符串。