Обработка событий Ruby Keyboard - PullRequest
1 голос
/ 22 мая 2009

Здравствуйте, я использую curses для разработки небольшого консольного приложения.

У меня есть секция основного цикла, которая ждет ввода пользователя, она использует функцию getstr, конечно, она ждет, когда пользователь нажмет ввод.

Я хотел бы захватить нажатия клавиш вверх и вниз и вкладки. Я полагаю, это не может быть сделано с getstr.

Кто-нибудь знает, как это сделать?

РЕДАКТИРОВАТЬ: я пытался использовать STDIN.getc, который блокирует запуск приложения, а getch не ловит клавиши со стрелками

РЕДАКТИРОВАТЬ # 2: я пытаюсь этот код на окнах. Кажется, что Curses.getch работает для Linux, но в Windows я не получаю ключ для стрелки вверх.

Ответы [ 2 ]

3 голосов
/ 22 мая 2009

Вам нужно установить режим "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.

0 голосов
/ 22 мая 2009

вы хотите получить, а не получить. также см. комментарий Курта Сампсона о том, что клавиши со стрелками не являются одним символом.

...