Answers:
当您在终端中按某个键或组合键时,它会以一个或多个字符的顺序传输到在终端中运行的应用程序。例如,当您按时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-q
或C-h c
之后在Emacs的组合键。
使用某些终端仿真器,可以为每个键配置转义序列。在Xterm上,这是通过X resources完成的。大多数设置从~/.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
以24
用于F5到F12-由于历史原因,F1通过F4具有不同转义序列)和number2
指示所述改性剂(2
对Shift,3
对Meta,5
对Ctrl,7
对Ctrl+ Meta,并添加1为Shift具有至少一个Ctrl或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)])
ESC
(除非您想尝试≥128个字符,但是这将限制可能的输入编码),而第二个字符必须是您不需要ESC foo
绑定的字符。
local-set-key
是define-key
吗?前者给出了一个错误(参数数量错误),而后者则起作用了,至少对于<kbd> C-Enter </ kbd>而言。似乎konsole仍然无法发送<kbd> CM-%</ kbd>。
define-key
。我不知道是否可以配置Konsole的转义键,xterm的可定制性可能比其他任何一种都高。
XTerm*modifyOtherKeys: 2
资源,即使对于C-M-
组合,它也将生成唯一的序列,但是使用该设置,您将需要提供许多自定义映射(XTerm*modifyOtherKeys: 1
功能较弱,但功能更强大,开箱即用)。例如(尽管这对我不起作用),请参见easymacs下载中的xterm-extras.el
库以及相关的.Xresources
和.inputrc
文件。
对于一组有限但重要的键,假设使用KDE的konsole,则可以执行以下操作以在emacs -nw中具有有效的复杂键绑定:
我将以S-<RET>
上班的实现为例:
Return+Shift
并为其提供有用的键序列(我选择的\E[27;3
是我在xev周围闲逛时X发送的键序列,但这可能是错误的-重要的事情是使请确保它具有正确的转义符并且不会与其他任何冲突)。启动emacs -nw
并在暂存缓冲区中评估:
(read-key-sequence-vector "Type your new key:")
然后输入新的组合键。
它应该吐出一个您可以绑定的密钥序列。
(它又回到[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)
简短的回答是,这是所有终端的基本限制。
稍长一点的答案是,即使有人创建了可以执行您想要的功能的终端,Emacs本身也需要进行重大更改才能与该假设的终端一起使用。
在扩展VT协议方面进行了一些努力,以允许无损键盘输入(以及其他功能,例如图形)。
一个例子是notty:https://github.com/withoutboats/notty
infocmp $TERM
吗?