我正在尝试从termcap数据库中获取表示箭头键的字符串。使用以下内容:
char *buffer = malloc(2048);
tgetent(buffer, getenv("TERM")); //TERM = xterm-256color
char *key_up = tgetstr("ku", &buffer); // gives me \EOA
ku
通过键入向上箭头键发送的输入字符串。
问题是当键入程序时,箭头键实际上作为\E[A
传递。它也像这样传递给cat
。我试过不同的终端模拟器和shell,他们都以同样的方式传递它。
所以我决定对密钥进行硬编码,而不是使用ku
值,它可以工作,但感觉不对。
我在这里错过了什么吗?如何以编程方式获得正确的ku
值?
终端描述是为全屏应用程序编写的,这些应用程序使用分配给它的一个或多个终端功能进行初始化。大约一半的终端描述初始化终端的光标键盘和键盘键以使用应用程序模式。在应用程序模式下,这些键发送不同的字符。
ncurses FAQ My cursor keys do not work详细介绍。
如果您尝试对某些非屏幕命令行应用程序使用终端描述,您可以使命令解析器同时将\E[
(CSI)和\EO
(SS3)视为同一事物,并忽略两种模式之间的差异。这是在zsh
的某些配置中完成的,如xterm manual page中所述。
顺便说一句,如果你的“termcap”实际上是terminfo系统的接口(例如ncurses),则不必分配缓冲区,因为它被忽略了。 ncurses的manual说:
- 仿真忽略缓冲区指针
bp
。 termcap库将在此指针引用的区域中存储终端描述的副本。但是,ncurses以编译的二进制形式存储其终端描述,这不是一回事。