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

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

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

答案1

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

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

Ctrl您可以通过按+V并在 shell 提示符中按该组合键,或在 Emacs 中按C-qC-h c后按该组合键来查看终端发送的组合键内容。

使用某些终端模拟器,您可以为每个键配置转义序列。在 Xterm 上,这是通过以下方式完成的X资源。大多数设置从~/.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表示功能键(15to 24for F5to F12— 由于历史原因,F1 到F4具有不同的转义序列)并number2表示修饰符(2for Shift3for Meta5for Ctrl7for Ctrl+ Meta,并为Shift至少添加 1Ctrl或 之一Meta)。

Emacs 通过以下方式将转义序列转换为其内部键表示:input-decode-map或者local-function-key-map(或function-key-mapEmacs 23 之前)。

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

答案2

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

我将以我的开始S-<RET>工作的实现为例:

  1. 打开新的 konsole,转到设置 -> 当前配置文件 -> 键盘 -> 编辑
  2. 点击添加并为它创建一个新条目Return+Shift并为其提供一个有用的键序列(我选择了\E[27;3我认为是当我在使用 xev 时由 X 发送的键序列,但这可能是错误的 - 重要的是使确保它有适当的转义并且不与其他任何东西冲突)。
  3. 在底部的小测试区域进行操作,以确保它正常工作。
  4. 重新启动控制台。
  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)
    

答案3

人们正在努力以允许无损键盘输入(以及其他功能,例如图形)的方式扩展 VT 协议。

notty 就是一个例子:https://github.com/withoutboats/notty

答案4

简而言之,这是所有终端的基本限制。

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

相关内容