Недавно я сделал нечто похожее (хотя мой код только для Linux). Вы должны установить стандартный ввод в неканонический режим, чтобы читать нажатия клавиш со стрелками. Это должно работать на OS X и Linux и, вероятно, будет работать на Cygwin, хотя я не могу сказать наверняка.
open Unix
let terminfo = tcgetattr stdin in
let newterminfo = {terminfo with c_icanon = false; c_vmin = 0; c_vtime = 0} in
at_exit (fun _ -> tcsetattr stdin TCSAFLUSH terminfo); (* reset stdin when you quit*)
tcsetattr stdin TCSAFLUSH newterminfo;
когда канонический режим выключен, вам не нужно ждать новой строки для чтения из stdin. c_vmin представляет минимальное количество символов для чтения перед возвратом (вы, вероятно, хотите иметь возможность читать один символ за раз), а c_vtime - максимальное время ожидания чтения (в единицах 0,1 с).
Вы также можете установить для c_echo
значение false, чтобы нажатия клавиш со стрелками печатались на терминале (но тогда вам придется печатать все остальное вручную.
Большинство терминалов представляют нажатия клавиш со стрелками, используя escape-последовательности ANSI . Если вы запустите cat
без аргументов и начнете нажимать клавиши со стрелками, вы увидите используемые escape-последовательности. Они, как правило,
up - "\033[A"
down - "\033[B"
left - "\033[D"
right - "\033[C"
Где '\ 033' - это значение ascii для esc