我的 Emacs 键绑定之一是C-'
,它在 GUI 中运行良好。然而,在终端中,它没有被识别。我知道我需要找出发送到终端的实际字符并将C-'
其映射到 emacs 配置中。
遵循以下建议在哪里可以找到用于在 bash 中重新映射快捷键的终端键代码列表?,sed -n l
返回给我的是一个空行,即使没有结尾$
。终端根本无法识别该C-'
序列吗?
答案1
终端传输字节,而不是密钥。像Ctrl+这样的键和弦'必须编码为字节序列。除了不带修饰符或仅带 的可打印字符外Shift,大多数键和弦都没有对应的字符,而是作为转义序列传输,以转义字符(字节值为 27 的字符,可以像\e
在 Emacs 字符串中一样编写)开头。但是许多键和弦没有传统的标准转义序列,并且许多终端要么不传输这些键和弦,要么删除有关修饰符的信息(仅将Ctrl+作为字符传输)。''
某些终端允许您为每个键和弦配置转义序列。在终端应用程序中,您可以通过键盘首选项执行此操作。
对于Ctrl+ ',选择\033[39;5~
或\033[27;5;39~
:这是两个新兴标准,libtermkey 方案和 xterm 方案。看使用终端时的键绑定问题了解更多信息。
Emacs 通过以下方式将转义序列转换为其内部键表示:input-decode-map
或者local-function-key-map
(或function-key-map
Emacs 23 之前)。将其中一个放入您的初始化文件中:
(define-key input-decode-map "\033[39;5~" [(control ?\')])
(define-key input-decode-map "\033[27;5;39~" [(control ?\')])
答案2
我尝试使用showkey
并注意到这c-'
与单独使用相同'
,在阅读了提到的答案并尝试了之后,我测试了键盘上的几乎所有按键showkey
,发现大多数按键^key
在按下控制键时都会有输出,^C
例如按下c-c
,但只有几个键不受按下 的影响c-
,例如不仅'
不受影响,
,而且.
按下时的点c-
甚至没有打印一个点,它什么也没做,所以我认为你的绑定不是在终端中工作,因为它就像按普通键一样'
什么也不做!但我无法解释为什么它可以在X
“也许”下工作,因为它可以识别它。
我鼓励您尝试使用您的密钥,showkey --ascii
并希望这个答案对您有所帮助。