bash的meta键是什么?


16

我试图用来xmodmap映射META_LMENU键,但是它似乎不被bash元键接受。因此,我想知道这些元素(键盘,X,xterm,bash)与元密钥和超级密钥之间的关系如何。任何解释将不胜感激。

让我换种说法。bash手册页说,例如,绑定了yank-nth-arg函数M-C-y,当我按时它可以工作Esc-Control-y。但是我觉得这有点麻烦。那么,如何使bash 为其所有默认绑定接受另一个键Meta(如Menu)呢?


MENUX甚至注意到您的密钥吗?您正在使用什么窗口管理器-其中一些可以帮助您重新定义键。
choroba 2012年

Answers:


11

从键盘键到修饰符的映射(例如MetaControl)由X服务器处理(即GUI的低级部分)。可以通过旧式xmodmap命令或新式XKB界面,或通过在后台使用其中之一的GUI配置工具来操纵此映射。

默认情况下,在大多数设置中,Meta键是标为的键Alt。这是因为从历史上看,许多UNIX工作站都标有密钥Meta,而PC上标有密钥Alt。因此,如果您有绑定M-C-y,请按Ctrl+ Alt+ Y

要检查您当前的绑定是什么,请xev在终端中启动程序。将xev窗口聚焦后,按键;您将在终端中看到生成的事件的成绩单。

终端仿真器(或与物理终端相对应的终端设备)与应用程序之间的通信使用字符。当您按时A,终端会收到信息“ A键,无修饰符”,但发送给终端中运行的应用程序的是字符a。当您按下UpF1之类的功能键时,没有相应的字符;只有当您按下该键时,才显示该字符。终端发送一个以转义字符(字节27,有时写为\e^[)开头的字符序列。当终端仿真器(例如xterm)收到带有Meta修饰符的按键事件时,它将按键转换为转义字符,后跟按键的基础功能,例如\ea,按Meta+ 时(转义,小写a)A

“终端”,“外壳”,“ tty”和“控制台”之间的确切区别是什么?可能是有用的背景。


5

关键事件由X服务器生成(由配置xmodmap),并发送到您的X应用程序。您的窗口管理器可以在将其发送到xterm之前对其进行拦截。反过来,XTerm将事件转换为一些字节,并将字节发送到由shell bash分配的伪tty。

请注意,并非所有事件都由XTerm直接转换为字节。例如,Ctrlshift键本身会生成X个键盘事件,但是XTerm 不会任何内容发送到在其中运行的shell(或其他应用程序)。这也包括Meta密钥本身,但不包括Menu密钥。但是,按Meta- 生成的事件e将使XTerm发送字节0xE5或两字节序列0x1B 0x65,具体取决于XTerm.VT100.metaSendsEscape资源设置。


2

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.

碰巧是ncursesxterm解释它的方式。提供了一些用于使此功能可选的终端(该方面并不广泛。您将遇到的大多数终端都使用硬编码的行为(并且不太有趣)。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位是奇偶校验,通常将其清除。如果存在字符串以打开和关闭此“元模式”,则可以将它们指定为smmrmm

一些不同的功能在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

元是修饰键的特例。喜欢controlshift,您与另一个键同时按下,希望看到与单独按下该键不同的东西。X通过在X事件中为键分配的修饰符值中分配一个位来提供修饰键。按键可以是多个X事件。X提供了在保留修饰符的同时合并这些事件的功能。

X还为键盘上可能出现的每个键定义符号。它通过组合事件的函数中的特殊处理来提供其他值(例如Unicode)。

但是“元”是一个特例。

meta除约定外,X应用程序没有密钥。X没有元键或元修饰符的定义。传统上,终端寻找- Alt键和/或已知的修饰符之一xmodmap,例如mod2。后来的xkb功能通过提供另一层信息来查找Alt密钥,使事情变得复杂(但相对于此讨论而言,没有任何改进)。

鉴于对meta既不xmodmap也不xkb了解,因此约定当然只能带您到目前为止。例如,xterm是可配置的,并且并非所有用户都希望以相同的方式配置meta。例如,可能不是预期的元密钥,例如,如果在资源中使用了它。另一个键可能是meta键,但是用户(尤其是在bash中使用转义序列的用户)可能希望在按下时发送转义字符。但是请记住,除非将其配置为修饰符,否则都不会发生:xterm不会单独组合事件。AlttranslationAlt

xterm有几种资源设置(在手册页中记录):

  • altIsNotMetaaltSendsEscape(在2007年添加)。
  • eightBitInput因为2006年对应于元模式的原始含义,并且为此定义了一个转义序列,该转义序列提供了smmand rmm(设置/删除元模式)终端功能。
  • eightBitInput2003年进行了修改,通过将解码的Unicode值移动128而不是原始输入字节来考虑UTF-8。
  • metaSendsEscape始于1999
  • eightBitInputmetaSendsEscape。自X11R4(1989)起,这已经实现了模式(添加第八位)或以键作为前缀的选择escape。但是该功能是在启动时确定的:在初始化过程中进行了检查,以确定输入是设置为允许8位还是仅允许7位。此后,它没有改变。

有人将这两个等同(8位和转义前缀),将后者称为模式。根据您eightBitInput对此问题的观点,xterm 的资源设置是获取可行的元密钥的解决方案的一部分。

进一步阅读:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.