ncurses 捕捉扩展键(Control-left,Shift-Function 等)

4
我正在尝试在我的Ruby程序中捕获Control-Left、Shift-F10等按键。通常,仅使用getch,我会得到一个整数列表,例如27,91,50,50,126,这有效。但是我担心这些可能取决于系统或终端。在谷歌上搜索后,我发现了use_extended_names、tigetstr等内容。我找到了一个使用这些内容的C程序(由Thomas Dickey编写),它可以在运行时发现按键代码。我运行它,似乎可以发现扩展键,但是在同一程序中的getch仍然给我通常的整数列表,例如[27,91,53,68],这就是我已经得到的C-left。我期望得到它提到的一个返回值。
我错过了什么?
当我按下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 下运行的。(我使用的是 Mac OSX 上的 Terminal)


当我运行你的示例程序时,会打印出3行:tigetstr for ... 如果你没有看到这些行,那么你的终端描述存在问题。你使用的是什么操作系统和终端? - Craig
2个回答

3
ncurses本身不知道控制、shift、meta和alt修饰符,因为它只知道字符。修饰符是特定终端知道的内容。一些终端可以将键盘修饰符编码到发送给主机的字符中。例如,xterm可以做到这一点。
terminfo(和termcap)具有预定义的特殊键列表(如光标键、功能键),包括少量修改后的特殊键(如向右移位键)。预定义的键在终端描述中具有明确定义的名称,并在curses.h头文件中具有KEY_xxx名称。ncurses提供了两种方法来扩展这些特殊键的列表。
  • tic-x选项,以及对应的use_extended_names函数(为给定的输入字符串定义名称)。
  • define_key函数(为给定的输入字符串分配 getch 返回的代码)。

ncurses 终端数据库提供了最有用的修改特殊键的定义,主要集中在光标键和编辑键盘上。但是这方面还存在一些问题:

终端数据库未提供所有定义,因为便携式terminfo定义仅限于4096字节。如果没有大小限制,那么可以为每个xterm键盘相关的资源设置生成完整的表(实际上有成千上万种组合)。
TERM设置为xterm的某些终端不发送与xterm相同的字符串。(事实上,大多数不同,尽管一些是子集而不仅仅是不同)。
对于给出的示例,在terminfo中的字符串将是\E[5D,这似乎不是xterm的字符串。(OP表示这是几年前的OSX终端,每个OSX版本都包括对终端的更改,但是没有任何一个OSX终端版本与xterm完全匹配)。之所以它看起来不像xterm的原因是修饰符(5)出现在第一个位置而不是第二个位置。xterm在2002年废弃了这种方法(patch #167)。
问题中提到了函数键,但没有具体说明。ncurses中使用的约定是为12个标准PC键盘功能键分配4个最有用的shift-和control-modifier组合,以获得48个功能键。在terminfo中预定义了60个功能键;当有其他已知的字符串时,剩余的十二个功能键将填满上限。
使用terminfo制作预定义表格的问题在于大小和终端假装成其他东西。而define_key函数没有大小限制,并且长期以来已经可用于具有专业需求的应用程序。例如,可以使用它通过合并最常见终端的最常见变体来构建表格。

2
Curses是在人们真正开始在终端中使用修饰符之前设计的。它的键处理模型实际上是一个值的平面枚举,并且不容易处理任意键+修饰符组合。
为了更好地解决这个问题,我编写了libtermkey,您可能更幸运地使用它。

http://www.leonerd.org.uk/code/libtermkey/

这是一个 C 库,虽然它同时具有 Perl 和 Python 绑定。我想应该很容易为它构建一些 Ruby 绑定。

那么ncurses本身也无法处理控制左键等吗? - Andrius Bentkus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接