在 C 或 OCaml 程序中是否可以采用跨平台的方式来处理退格键和箭头键?
实际上 OCaml 解决方案会很受欢迎,但许多标准 unix 函数直接包装到相应的 API 调用,因此移植 C 解决方案应该没有问题。
我要实现的是捕捉箭头键以覆盖其在 shell 内的行为(通过重新支持最后一行或类似的操作)。我认为这件事落在实际程序之前,并且它不是由代码本身处理的,所以我不知道这是否可能。
该程序是在 Linux、OS X 和 Windows(在 cygwin 上)上编译的,所以我想在所有平台上都这样做。
最佳答案
我最近做了一些非常相似的事情(尽管我的代码仅适用于 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;
当规范模式关闭时,您无需等待换行符即可从标准输入读取。 c_vmin 表示返回前要读取的最少字符数(您可能希望一次能够读取一个字符),c_vtime 是最长读取等待时间(以 0.1s 为单位)。
您可能还想将 c_echo
设置为 false,以便将箭头键按下打印到终端(但随后您必须手动打印其他所有内容。
大多数终端使用 ANSI escape sequences 表示箭头键按下.如果您不带参数运行 cat
并开始按箭头键,您可以看到使用的转义序列。他们通常是
up - "\033[A"
down - "\033[B"
left - "\033[D"
right - "\033[C"
其中 '\033' 是 esc
的 ascii 值
关于c - 使用标准输入识别方向键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4130048/