传统上,终端中的命令/ 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
答案 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
事件,并将内部缓冲区作为参数。然后,内部缓冲区重置为空字符串。