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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在终端中监听命令/控制+ L信号相关的知识,希望对你有一定的参考价值。

传统上,终端中的命令/控制+(小写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有关

答案

我挖了一下并写了一个快速的脚本作为概念证明。这是处理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事件。然后,内部缓冲区重置为空字符串。

以上是关于在终端中监听命令/控制+ L信号的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——cli的终端命令大全

VSCode自定义代码片段4——cli的终端命令大全

linux命令中ps -ef是啥意思

linux12shell编程 -->信号控制

shell从入门到精通(10)信号捕获和处理

ps-ef查看的内容