Answers:
从键盘键到修饰符的映射(例如Meta
和Control
)由X服务器处理(即GUI的低级部分)。可以通过旧式xmodmap
命令或新式XKB界面,或通过在后台使用其中之一的GUI配置工具来操纵此映射。
默认情况下,在大多数设置中,Meta
键是标为的键Alt。这是因为从历史上看,许多UNIX工作站都标有密钥Meta,而PC上标有密钥Alt。因此,如果您有绑定M-C-y
,请按Ctrl+ Alt+ Y。
要检查您当前的绑定是什么,请xev
在终端中启动程序。将xev窗口聚焦后,按键;您将在终端中看到生成的事件的成绩单。
终端仿真器(或与物理终端相对应的终端设备)与应用程序之间的通信使用字符。当您按时A,终端会收到信息“ A
键,无修饰符”,但发送给终端中运行的应用程序的是字符a
。当您按下Up或F1之类的功能键时,没有相应的字符;只有当您按下该键时,才显示该字符。终端发送一个以转义字符(字节27,有时写为\e
或^[
)开头的字符序列。当终端仿真器(例如xterm)收到带有Meta
修饰符的按键事件时,它将按键转换为转义字符,后跟按键的基础功能,例如\ea
,按Meta+ 时(转义,小写a)A。
“终端”,“外壳”,“ tty”和“控制台”之间的确切区别是什么?可能是有用的背景。
关键事件由X服务器生成(由配置xmodmap
),并发送到您的X应用程序。您的窗口管理器可以在将其发送到xterm之前对其进行拦截。反过来,XTerm将事件转换为一些字节,并将字节发送到由shell bash分配的伪tty。
请注意,并非所有事件都由XTerm直接转换为字节。例如,Ctrl和shift键本身会生成X个键盘事件,但是XTerm 不会将任何内容发送到在其中运行的shell(或其他应用程序)。这也包括Meta密钥本身,但不包括Menu密钥。但是,按Meta- 生成的事件e将使XTerm发送字节0xE5或两字节序列0x1B 0x65,具体取决于XTerm.VT100.metaSendsEscape资源设置。
Bash的meta键最初是这样定义的(lib/readline/ChangeLog
):
Mon Jul 13 11:34:07 1992 Brian Fox (bfox@cubit)
* readline.c: (rl_variable_bind) New variable "meta-flag" if "on"
means force the use of the 8th bit as Meta bit. Internal variable
is called meta_flag.
碰巧是ncurses和xterm解释它的方式。提供了一些用于使此功能可选的终端(该方面并不广泛。您将遇到的大多数终端都使用硬编码的行为(并且不太有趣)。terminfo手册页记录了这些终端功能:
has_meta_key km km Has a meta key
(i.e., sets 8th-bit)
meta_off rmm mo turn off meta mode
meta_on smm mm turn on meta mode
(8th-bit on)
并说明功能:
如果终端具有用作移位键的“元键”,则将传输的任何字符的第8位设置为1,则可以用表示这一事实
km
。否则,软件将假定第8位是奇偶校验,通常将其清除。如果存在字符串以打开和关闭此“元模式”,则可以将它们指定为smm
和rmm
。
一些不同的功能在Alt
某些终端仿真器中加入了响应转义符的前缀转义字符。Bash(实际上是readline
库)在2004年的变更日志中记录了该用法:
lib/readline/callback.c
- use _rl_dispatch_callback and a chain of _rl_keyseq_contexts to
simulate the recursion used to decode multicharacter key sequences
(even things like ESC- as meta-prefix
元是修饰键的特例。喜欢control和shift,您与另一个键同时按下,希望看到与单独按下该键不同的东西。X通过在X事件中为键分配的修饰符值中分配一个位来提供修饰键。按键可以是多个X事件。X提供了在保留修饰符的同时合并这些事件的功能。
X还为键盘上可能出现的每个键定义符号。它通过组合事件的函数中的特殊处理来提供其他值(例如Unicode)。
但是“元”是一个特例。
meta除约定外,X应用程序没有密钥。X没有元键或元修饰符的定义。传统上,终端寻找- Alt键和/或已知的修饰符之一xmodmap
,例如mod2
。后来的xkb功能通过提供另一层信息来查找Alt密钥,使事情变得复杂(但相对于此讨论而言,没有任何改进)。
鉴于对meta既不xmodmap
也不xkb
了解,因此约定当然只能带您到目前为止。例如,xterm是可配置的,并且并非所有用户都希望以相同的方式配置meta。例如,可能不是预期的元密钥,例如,如果在资源中使用了它。另一个键可能是meta键,但是用户(尤其是在bash中使用转义序列的用户)可能希望在按下时发送转义字符。但是请记住,除非将其配置为修饰符,否则都不会发生:xterm不会单独组合事件。Alttranslation
Alt
xterm有几种资源设置(在手册页中记录):
altIsNotMeta
和altSendsEscape
(在2007年添加)。eightBitInput
因为2006年对应于元模式的原始含义,并且为此定义了一个转义序列,该转义序列提供了smm
and rmm
(设置/删除元模式)终端功能。eightBitInput
在2003年进行了修改,通过将解码的Unicode值移动128而不是原始输入字节来考虑UTF-8。metaSendsEscape
始于1999eightBitInput
比metaSendsEscape
。自X11R4(1989)起,这已经实现了元模式(添加第八位)或以键作为前缀的选择escape。但是该功能是在启动时确定的:在初始化过程中进行了检查,以确定输入是设置为允许8位还是仅允许7位。此后,它没有改变。有人将这两个等同(8位和转义前缀),将后者称为元模式。根据您eightBitInput
对此问题的观点,xterm 的资源设置是获取可行的元密钥的解决方案的一部分。
进一步阅读:
MENU
X甚至注意到您的密钥吗?您正在使用什么窗口管理器-其中一些可以帮助您重新定义键。