gpt4 book ai didi

ncurses 捕获扩展键(Control-left、Shift-Function 等)

转载 作者:行者123 更新时间:2023-12-03 22:56:16 25 4
gpt4 key购买 nike

我试图在我的 ruby​​ 程序中捕获 Control-Left、Shift-F10 等。通常,只使用 getch 我会得到一个整数列表,例如 27,91,50,50,126 可以工作。但是我担心这些可能取决于系统或终端。在谷歌搜索之后,我发现了 use_extended_names、tigetstr 等。我发现了一个使用这些的 C 程序,它在运行时发现了键码(由 Thomas Dickey 编写)。我运行它,它似乎发现了扩展键,但是同一程序中的 getch 仍然为我提供了通常的整数列表,例如 C-left 的 [27,91,53,68] 无论如何我都会得到。我希望得到一个返回值,它提到的那个。

我错过了什么?

这是我按下 Control-left 时的输出:

keypress=27
keypress=91
keypress=53
keypress=68
key=kLFT5, code=540
key=kEND5, code=525
key=kHOM5, code=530
key=kHOM3, code=528
key=kUP5, code=561
key=kDN5, code=520

我不应该只得到 540 吗?

这是 keytest.c: https://gist.github.com/1237091

奇怪的是,在 TERM=screen 下运行时,所有代码都显示为 0。以上是TERM=xterm。
(我在 OSX 上使用终端)

最佳答案

ncurses 本身不知道 control-、shift-、meta- 和 alt-修饰符,因为它只知道字符。修饰符是特定终端知道的东西。一些终端可以在它们发送给主机的字符中编码键盘修饰符。 xterm,例如可以做到这一点。

terminfo(和 termcap)具有预定义的特殊键列表(例如光标键、功能键),包括少量修改后的特殊键(例如右移箭头)。预定义的键在终端描述中具有明确定义的名称以及 KEY_ curses.h中的xxx名称标题。 ncurses 提供了两种方法来扩展这些特殊键列表

  • -x tic 的选项与相应的 use_extended_names函数(定义给定输入字符串的名称)。
  • define_key函数(它为给定的输入字符串分配一个由 getch 返回的代码)。

  • ncurses 终端数据库为修改后的特殊键提供了最有用的定义,重点是光标键和编辑小键盘。
    这有几个问题:
  • 终端数据库不提供所有定义,因为可移植 terminfo 定义被限制为 4096 字节。如果没有大小限制,那么可以想象,可以为 xterm 的键盘相关资源设置的(字面上)数千种组合中的每一种生成完整的表格。
  • 一些终端设置TERMxterm不要发送与 xterm 相同的字符串。 (事实上​​,大多数不同,尽管有一些是子集而不是简单的不同)。
  • 对于给出的示例, terminfo 中的字符串将为 \E[5D ,这似乎不是 xterm 之一。 (OP 表示这是几年前的 OSX 终端——OSX 的每个版本都包含对终端的更改,但没有任何版本的 OSX 终端与 xterm 完全匹配)。它看起来不是 xterm 的原因是修饰符 (5) 出现在第一个位置而不是第二个位置。 xterm 在 2002 年弃用了它 ( patch #167 )。
  • 问题中提到了功能键,但没有具体说明。 ncurses 中使用的约定是为(几乎是标准的)12 个 PC 键盘功能键分配 4 个最有用的 shift 和 control 修饰符组合,以获得 48 个功能键。 terminfo中有60个预定义的功能键;当这些字符串有额外的已知字符串时,剩余的 12 个字符串将填充到限制。

  • 使用 terminfo 制作预定义的表格就这么多(大小和终端的问题假装是不同的)。 define_key功能没有大小限制,长期以来一直适用于有特殊需求的应用程序。例如,可以通过合并最常见终端的最常见变体来使用它来构建表格。

    关于ncurses 捕获扩展键(Control-left、Shift-Function 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7528091/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com