有没有可以处理所有按键组合的linux终端?


11

我喜欢在终端模式(-nw)中使用emacs ,但似乎大多数(全部?)终端无法处理某些键组合-例如,C-<RET>C-M-%。我知道这是因为大多数终端都模仿VT-100,但没有这些组合。是否有任何Linux终端(最好是KDE)可以处理这些键组合,或者这是所有终端的基本限制吗?

Answers:


15

当您在终端中按某个键或组合键时,它会以一个或多个字符的顺序传输到在终端中运行的应用程序。例如,当您按时a,应用程序会收到a。当您按时Enter,应用程序将接收字符CR(又名^M(发音为“ control-emm”),又称字符号13,又名\r\015)。所涉及的键组合Alt通常以字符ESC^[也称为aka \e\033)的形式传输,后跟键的顺序或不带的键组合Alt。功能键和其他键组合作为以\e[或开头的转义序列进行传输\eO

转义序列尚未完全标准化,终端通常会忽略某些键的某些属性。例如,默认情况下,Ctrl+ Shift+ letter通常与Ctrl+ 完全一样地传输letter

你可以看到通过按组合键终端发送的内容Ctrl+ V其次是组合键,在shell提示下,或C-qC-h c之后在Emacs的组合键。

使用某些终端仿真器,可以为每个键配置转义序列。在Xterm上,这是通过X resources完成的。大多数设置从~/.XresourcesX启动时开始读取资源,您可以使用手动加载文件xrdb -merge ~/.Xresources

Term.VT100.translations:       #override \n\
    Ctrl ~Shift ~Meta <key>Return: string("\033[73;5~") \n\
    Ctrl Shift ~Meta <key>percent: string("\033[37;6~")

常见的约定ESC [ number1 ; number2 ~对带有修饰符的功能键使用形式的转义序列。number1表示功能键(1524用于F5F12-由于历史原因,F1通过F4具有不同转义序列)和number2指示所述改性剂(2Shift3Meta5Ctrl7Ctrl+ Meta,并添加1为Shift具有至少一个CtrlMeta)。

Emacs通过input-decode-maplocal-function-key-map(或function-key-map在Emacs 23之前)将转义序列转换为其内部键表示形式。

(define-key local-function-key-map "\033[73;5~" [(control return)])
(define-key local-function-key-map "\033[37;6~" [(control ?L)])

因此,如果我正确理解了这一点,则需要首先在终端中定义一个转义序列,该序列对应于某些组合键。然后,在emacs中,我需要将转义序列映射回键组合。只要转义序列与中定义的转义序列不冲突,它可以是任意的infocmp $TERM吗?
Yossarian 2013年

2
@Yossarian是的。除了不冲突之外,转义序列必须是明确的,即,任何转义序列都不应该是另一个的前缀。这实际上意味着必须使用第一个字符ESC(除非您想尝试≥128个字符,但是这将限制可能的输入编码),而第二个字符必须是您不需要ESC foo绑定的字符。
吉尔(Gilles)'所以

我只是想尝试一下您的建议。应该local-set-keydefine-key吗?前者给出了一个错误(参数数量错误),而后者则起作用了,至少对于<kbd> C-Enter </ kbd>而言。似乎konsole仍然无法发送<kbd> CM-%</ kbd>。
Yossarian 2013年

@Yossarian确实应该define-key。我不知道是否可以配置Konsole的转义键,xterm的可定制性可能比其他任何一种都高。
吉尔(Gilles)'所以

1
请注意,Thomas Dickey的xterm正在积极开发中。使用该XTerm*modifyOtherKeys: 2资源,即使对于C-M-组合,它也将生成唯一的序列,但是使用该设置,您将需要提供许多自定义映射(XTerm*modifyOtherKeys: 1功能较弱,但功能更强大,开箱即用)。例如(尽管这对我不起作用),请参见easymacs下载中的xterm-extras.el库以及相关的.Xresources.inputrc文件。
phils 2013年

1

对于一组有限但重要的键,假设使用KDE的konsole,则可以执行以下操作以在emacs -nw中具有有效的复杂键绑定:

我将以S-<RET>上班的实现为例:

  1. 打开一个新的Konsole,转到设置->当前配置文件->键盘->编辑
  2. 点击添加并为其输入一个新的条目,Return+Shift并为其提供有用的键序列(我选择的\E[27;3是我在xev周围闲逛时X发送的键序列,但这可能是错误的-重要的事情是使请确保它具有正确的转义符并且不会与其他任何冲突)。
  3. 在底部的小测试区域中进行操作,以确保其正常工作。
  4. 重新启动konsole。
  5. 启动emacs -nw并在暂存缓冲区中评估:

    (read-key-sequence-vector "Type your new key:")

    然后输入新的组合键。

    • 如果您不熟悉此内容,请将其写出,将光标留在该行的末尾,然后按Cx Ce以使emacs运行该行,它应该对您说出您在引号中加上的内容,然后等待输入一些东西。
  6. 它应该吐出一个您可以绑定的密钥序列。
    (它又回到[27 91 50 55 59 51]了我身边,而不是让我厌烦[13]了konsole键盘绑定之前那无聊的老家伙。)

  7. 添加到您的emacs配置:

    (define-key function-key-map [27 91 50 55 59 51] [(shift return)])
    
  8. emacs -nw在屏幕会话中使用以下命令进行了测试:

    (define-key ess-mode-map [(shift return)] #'ess-eval-line-and-step)
    (define-key sh-mode-map [(shift return)]  #'send-line-to-shell)
    

0

简短的回答是,这是所有终端的基本限制。

稍长一点的答案是,即使有人创建了可以执行您想要的功能的终端,Emacs本身也需要进行重大更改才能与该假设的终端一起使用。


关于emacs的好处是,我什至没有想到。我想我会改用gui。
Yossarian 2013年

我就是做这个的。
hruvulum 2013年

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.