0

我正在尝试从 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值?

4

1 回答 1

2

终端描述是为全屏应用程序编写的,这些应用程序使用分配给它的一个或多个终端功能进行初始化。大约一半的终端描述初始化终端的光标键和键盘键以使用应用程序模式。在应用程序模式下,这些键发送不同的字符。

ncurses 常见问题解答我的光标键不起作用详细介绍。

如果您尝试对某些非屏幕命令行应用程序使用终端描述,您可以让命令解析器将\E[(CSI) 和\EO(SS3) 视为同一事物,而忽略这两种模式之间的差异。如xterm 手册页zsh中所述,这是在某些配置中完成的。

顺便说一句,如果您的“termcap”实际上是 terminfo 系统的接口(例如 ncurses),则无需分配缓冲区,因为它被忽略了。ncurses 的手册 说:

  • 仿真忽略缓冲区指针bptermcap库将在此指针引用的区域中存储终端描述的副本。但是,ncurses以编译后的二进制形式存储其终端描述,这不是一回事。
于 2019-03-12T20:24:59.440 回答