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

问题描述 投票:0回答:1

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

我可以通过将此文件写入stdout来使用Node.js清除终端:

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

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

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

node.js terminal signals stdout
1个回答
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。

考虑到这一点,您可以转换在'data'事件中获得的缓冲区,并检查它是否为SIGINT(Ctrl-C),'clear'命令(Ctrl-L),EOF(Ctrl-D), ...

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

© www.soinside.com 2019 - 2024. All rights reserved.