Zsh 获取带有修饰符的 terminfo 键

aaa*_*aaa 4 zsh terminfo

Zsh 上的 Arch Linux Wiki 页面有一个从 terminfo 获取按键序列的示例。

typeset -g -A key

key[Home]="${terminfo[khome]}"
key[End]="${terminfo[kend]}"
...
Run Code Online (Sandbox Code Playgroud)

但是我怎样才能得到带有修饰符的呢?具体来说是 Alt+j 和 Alt+k。

谢谢。

Tho*_*key 7

终端ncurses数据库定义了这些(请参阅常见问题解答中的如何使用移位或控制修饰符?ncurses)。

其中大部分是基于所做的工作xterm(例如,请参见此页)。

这些是唯一的名称(会zsh被忽略,因为它们不在预定义终端名称的字典中 - 请参阅Src/Modules/terminfo.c)。例如,您必须对 的输出进行一些 shell 赋值,tput才能将数据放入变量中。

Alt当应用于普通键(例如中的或)时,通常不被视为修饰符jkxterm

它有一个模式(modifyOtherKeys),可以告诉它发送不同组合的转义序列(请参阅常见问题解答中的如何让我的程序区分 control-I 和 tab?xterm)。

在这种情况下,zsh根本不提供任何帮助。同样,终端不会提供结果表(它处理特殊键)。需要定制应用程序。

您可能想到了功能。它确实有一个 terminfo 功能(smm启用、rmm禁用)。然而,大多数终端(除了)的实现方式与记录的xterm行为不同。在:terminfo(5)

如果终端具有充当移位键的“元键”,设置所传输的任何字符的第 8 位,则可以用 来指示这一事实 km。否则,软件将假定第 8 位是奇偶校验位,并且通常会被清除。如果存在用于打开和关闭此“元模式”的字符串,则可以将它们指定为smmrmm

这部分是由于bash文档中发现的向后定义(有关详细信息,请参阅我的答案)。但无论如何,terminfo 都不会保存告诉您的脚本哪些字符可能以 为前缀的信息Escape