Я немного покопался и написал быстрый сценарий в качестве доказательства концепции.Это пример обработки сигналов Ctrl-C, Ctrl-D и Ctrl-L И наличия прослушивателя событий на новых строках, даже с включенным режимом raw.
#!/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
генерируется с внутренним буфером в качестве аргумента.Затем внутренний буфер сбрасывается в пустую строку.