Как читать односимвольные последовательности и специальные последовательности команд? - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь прочитать отдельные символы из стандартного ввода. Согласно этой проблеме https://github.com/denoland/deno/issues/3614 в настоящее время кажется невозможным без использования сигнала окончания файла, такого как ENTER. Кто-нибудь знает, как я могу захватить специальные команды, такие как ctrl + c?

1 Ответ

0 голосов
/ 06 апреля 2020

Как вы уже обнаружили в данный момент, невозможно прочитать один символ из Deno.stdin.

Однако возможно с небольшими затратами имитировать такое поведение: например, обходной путь используйте процесс, который читает символ за символом, добавляет символ ENTER и переводит в deno.

Например, в поле linux с bash:

terminal> ./read1char.sh | deno demo.ts

read1char. sh:

#!/bin/bash

while true
do
   read -n1 varname

   # echo append a newline to input char
   echo "$varname"
done

demo.ts:

async function handle_signal() {
  for await (const _ of Deno.signal(Deno.Signal.SIGINT)) {
    console.log("interrupted!");
  }
}

async function main() {
  const decoder = new TextDecoder();
  const encoder = new TextEncoder();

  const file = Deno.stdin;
  while (true) {
    const c = new Uint8Array(1);
    if (await file.read(c) == Deno.EOF) {
      break;
    }
    const char = decoder.decode(c);
    if (char != "\n") {
      Deno.stdout.write(encoder.encode(char.toUpperCase()));
    }
  }
}

main();
handle_signal();

handle_signal - это простой обработчик сигнала, который захватывает SIGINT.

...