Вам нужно установить режим "cbreak" tty, чтобы вы сразу получали нажатия клавиш. Если вы этого не сделаете, система обработки терминалов Unix будет буферизовать ввод до тех пор, пока не будет получена новая строка (т. Е. Пользователь нажмет ENTER
), и все данные будут переданы процессу в этот момент.
Это на самом деле не зависит от Ruby или даже curses; так работают все приложения, работающие через Unix tty.
Попробуйте использовать функцию библиотеки curses cbreak()
, чтобы включить этот режим. Не забудьте позвонить nocbreak()
, чтобы отключить его перед выходом!
Для чтения одного символа, STDIN.getc
вернет Fixnum кода ASCII символа. Вполне возможно, вы найдете STDIN.read(1)
более удобным, поскольку он возвращает односимвольную строку следующего символа.
Однако вы обнаружите, что клавиши «вверх / вниз», если вы имеете в виду клавиши со стрелками, на самом деле представляют собой последовательность символов. На большинстве ANSI-подобных терминальных эмуляторов в наши дни (например, xterm), стрелка вверх будет, например, "\e[A
" (что \e
является escape-символом). Существуют базы данных termcap (терминальные возможности), чтобы иметь дело с такими вещами, и вы можете получить к ним доступ через проклятия, но изначально вам может быть проще всего экспериментировать с их интерпретацией напрямую; В наши дни маловероятно, что вы столкнетесь с терминалом, использующим что-либо кроме кодов ANSI.