Zsh 上的 Arch Linux Wiki 页面有一个从 terminfo 获取按键序列的示例。
typeset -g -A key
key[Home]="${terminfo[khome]}"
key[End]="${terminfo[kend]}"
...
但是我怎样才能得到带有修饰符的呢?具体来说是 Alt+j 和 Alt+k。
谢谢。
答案1
终端ncurses
数据库定义了这些(参见如何使用移位或控制修饰符?在ncurses
常见问题解答中)。
其中大部分是基于所做的工作xterm
(参见这一页, 例如)。
这些是唯一的名称(会zsh
被忽略,因为它们不在预定义终端名称的字典中 - 请参阅src/Modules/terminfo.c)。例如,您必须对 的输出进行一些 shell 赋值,才能tput
将数据放入变量中。
Alt通常不被视为修饰语当应用于普通键时,例如j
或者k
在里面xterm
。
它有一个模式(修改其他键),它可以告诉它发送不同组合的转义序列(请参阅我的程序如何区分 control-I 和 tab?在xterm
常见问题解答中)。
在这种情况下,zsh
根本不提供任何帮助。同样,终端不会提供结果表(它处理特殊键)。需要定制应用程序。
您可能想到的是元特征。那确实有一个 terminfo 功能(smm
启用,rmm
禁用)。然而,大多数终端(除了xterm
)的实现方式与记录在案行为。在terminfo(5)
:
如果终端有一个充当 Shift 键的“元键”,设置传输的任何字符的第 8 位,则可以用以下命令表示这一事实:
km
。否则,软件将假定第 8 位是奇偶校验位,并且通常会被清除。如果存在用于打开和关闭此“元模式”的字符串,则可以将它们指定为smm
和rmm
。
这部分是由于bash
文档中发现的向后定义(请参阅我的答案了解详情)。但无论如何,terminfo 都不会保存告诉您的脚本哪些字符可能以 为前缀的信息Escape。