У меня есть консольное приложение в 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?