У меня есть консольное приложение в Elixir. Мне нужно интерпретировать ввод пользователей на основе нажатия клавиш. Например, мне нужно рассматривать "q" как команду для завершения сеанса, без необходимости явно нажимать ⏎ a.k.a. "возврат каретки".
IO.getn/2
неожиданно ждет нажатия ⏎, буферизации ввода (я почти уверен, что эта буферизация выполняется самой консолью, но man stty
не предоставляет никакой помощи/флага, чтобы отключить буферизацию.)
Mix.Utils
использовать бесконечный цикл, чтобы скрыть ввод пользователя (в основном, посылать контрольную последовательность backspace для консоли каждые 1 мс); IEx
код обертывает вызовы стандартным erlangs io
, который предоставляет единственную возможность установить обратный вызов на Tab (для автозаполнения.)
Мое предположение: я должен использовать Port
, прикрепить его к :stdin
и вызвать процесс для прослушивания ввода. К сожалению, я застрял в попытке реализовать последнее, так как мне нужно подключиться к текущей запущенной консоли, а не создавать новый порт для какого-либо другого процесса (как это отлично описано здесь.)
Я пропустил что-то очевидное о том, как мне прикрепить Port
к текущему процессу :stdin
(который указан btw в Port.list/0
), или должен ли Ive построить всю 3-трубную архитектуру для перенаправления введенных до :stdin
и независимо от того, что моя программа хочет puts
до :stdout
?