我最近做了一些非常相似的事情(尽管我的代码只是Linux).您必须将stdin设置为非规范模式才能读取箭头键.这应该适用于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;
Run Code Online (Sandbox Code Playgroud)
当规范模式关闭时,您不需要等待换行符才能从标准输入读取.c_vmin表示返回前要读取的最小字符数(您可能希望一次只能读取一个字符),c_vtime是最大读取等待时间(以0.1s为单位).
您可能还希望设置c_echo为false,以便按下箭头键打印到终端(但是您必须手动打印其他所有内容.
大多数终端使用ANSI转义序列表示箭头按键.如果您在cat没有参数的情况下运行并开始按箭头键,则可以看到使用的转义序列.他们通常是
up - "\033[A"
down - "\033[B"
left - "\033[D"
right - "\033[C"
Run Code Online (Sandbox Code Playgroud)
其中'\ 033'是ascii值 esc