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