【问题标题】:Termcap tgetstr getting arrow keysTermcap tgetstr 获取箭头键
【发布时间】:2019-03-10 16:52:52
【问题描述】:

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

【问题讨论】:

  • 您的 TERM 似乎设置不正确?
  • 我正在使用 KDE + Konsole 并且我的期限设置为 xterm-256color 并且 my 终端确实产生了 \E[A
  • ... ku 返回\E0A...

标签: c unix tty termcap


【解决方案1】:

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

ncurses 常见问题解答My cursor keys do not work 更详细。

如果您尝试对某些非屏幕命令行应用程序使用终端描述,您可以让命令解析器同时处理 \E[ (CSI) 和 @987654325 @ (SS3) 一样的东西,忽略两种模式的区别。这是在zsh 的某些配置中完成的,如xterm manual page 中所述。

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

  • 仿真忽略缓冲区指针bptermcap 库将在该区域中存储终端描述的副本 此指针引用。然而,ncurses 以编译后的二进制形式存储其终端描述,这并不相同 东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-16
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2020-09-01
    • 2017-09-20
    • 1970-01-01
    相关资源
    最近更新 更多