c - 使用标准输入识别方向键

标签 c input terminal ocaml stdin

在 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/

相关文章:

html - HTML 输入元素可以有多种类型吗?

Jquery - 查找下一个输入 :text element after a known element

linux - 如何在 Linux 终端中创建电子邮件帐户/地址?

c++ - 通过 DLL 在 x64 上进行内联汇编

c - 使用 Stat 和 OpenDir()/ReadDir() 在 C 语言中列出当前目录和文件类型(Dir、Reg、Lnk)

c - 从文件中获取字符串

python - 如何检查 Python 中的整数输入?

javascript - linux 共享库可以打开、显示和 printf 到终端吗?

go - golang 中的终端 : syscall vs os/exec stty

c - 我如何释放一个结构?