我喜欢在终端模式 ( ) 下使用 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-q
或C-h c
后按该组合键来查看终端发送的组合键内容。
使用某些终端模拟器,您可以为每个键配置转义序列。在 Xterm 上,这是通过以下方式完成的X资源。大多数设置从~/.Xresources
X 启动时读取资源,您可以使用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
表示功能键(15
to 24
for F5to F12— 由于历史原因,F1 到F4具有不同的转义序列)并number2
表示修饰符(2
for Shift、3
for Meta、5
for Ctrl、7
for Ctrl+ Meta,并为Shift至少添加 1Ctrl或 之一Meta)。
Emacs 通过以下方式将转义序列转换为其内部键表示:input-decode-map
或者local-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)])
答案2
对于一组有限但重要的按键,假设使用 KDE 的 konsole,可以执行以下操作以在 emacs -nw 中获得有效的、复杂的按键绑定:
我将以我的开始S-<RET>
工作的实现为例:
- 打开新的 konsole,转到设置 -> 当前配置文件 -> 键盘 -> 编辑
- 点击添加并为它创建一个新条目
Return+Shift
并为其提供一个有用的键序列(我选择了\E[27;3
我认为是当我在使用 xev 时由 X 发送的键序列,但这可能是错误的 - 重要的是使确保它有适当的转义并且不与其他任何东西冲突)。 - 在底部的小测试区域进行操作,以确保它正常工作。
- 重新启动控制台。
启动
emacs -nw
并在暂存缓冲区中评估:(read-key-sequence-vector "Type your new key:")
然后输入新的组合键。
- 如果您对此不熟悉,请写出该行,将光标保留在该行末尾,然后按 Cx Ce 让 emacs 运行该行,它应该告诉您您在引号中输入的内容并等待您输入一些东西。
它应该会输出一个您可以绑定的按键序列。
(它又回到了[27 91 50 55 59 51]
我的身边,而不是[13]
我弄乱 konsole 键绑定之前的无聊旧东西。)添加到您的 emacs 配置:
(define-key function-key-map [27 91 50 55 59 51] [(shift return)])
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 本身也需要进行重大更改才能与这个假设的终端配合使用。