Прослушайте сигнал команды / ctrl + L в терминале - PullRequest
0 голосов
/ 20 мая 2018

Традиционно команда / ctrl + (строчная буква L) в терминале очищает его.

Я могу очистить терминал, используя Node.js, записав это в стандартный вывод:

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

но как я могу прослушивать сигналы, в частности комбинацию клавиш «команда + l»?(это строчная буква L).

Я думаю, что с Node.js ответ, вероятно, связан с: readline.emitKeypressEvents https://nodejs.org/api/readline.html#readline_readline_emitkeypressevents_stream_interface

1 Ответ

0 голосов
/ 20 мая 2018

Я немного покопался и написал быстрый сценарий в качестве доказательства концепции.Это пример обработки сигналов 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 генерируется с внутренним буфером в качестве аргумента.Затем внутренний буфер сбрасывается в пустую строку.

...