【发布时间】:2019-02-08 07:17:12
【问题描述】:
当我在这样的终端中启动新的 emacs 时
emacs -nw -Q
我可以尝试通过键入 C-h k 来检查某个键盘快捷键绑定的内容。当我在启动 Emacs 后对 *scratch* 缓冲区中的快捷方式 M-S-
运行命令 left-word(在 global-map 中找到),它是 在“bindings.el”中交互式编译的 Lisp 函数。 绑定到
、 。 [...]
请注意识别的键序列中缺少“Shift”修饰符。
现在,第一个直觉是终端(在我的例子中是 gnome-terminal)没有产生正确的转义序列,但它确实产生了:输入 CTRL-V ALT-SHIFT-left in终端(即不在 Emacs 中)产生
^[[1;4D
并在 Emacs 中键入 C-q C-S-^[是单个字符,即ASCII 27(“Escape”)。)
检查input-decode-map 显示以下值(为简洁起见,省略了一些部分(标记为...)):
(keymap
(27 keymap ... )
keymap
(keymap
(27 keymap
...
(91 keymap
...
(51 keymap
...
(59 keymap
(51 keymap
...
(68 .
[M-left])
(52 keymap
...
(68 .
[M-S-left])
...)
...)
...)
...))))
使用以下代码验证两个键序列会得到预期的结果:
(mapc '(lambda (c) (insert (format "%c" c))) '(27 91 49 59 51 68)) ; ^[[1;3D
(mapc '(lambda (c) (insert (format "%c" c))) '(27 91 49 59 52 68)) ; ^[[1;4D
但是,我不明白为什么这些序列被嵌入到二级内部(keymap ...) 列表中?!
它变得更奇怪了。
回到*scratch*,当我输入时
M-x local-set-key
然后是 M-S-
Set key <M-S-left> locally to command:
如果我继续并提供一个随机函数,比如beginning-of-line,随后调用 C-h k 后跟 M-S-
运行命令开头的行(在 lisp-interaction-mode-map),这是一个交互式内置函数 在“C 源代码”中。 绑定到
。 [...]
将 M-S-nil 将恢复 C-h k 报告 M-S-<M-left>。
这里发生了什么?这是配置问题,还是预期行为,还是涉及透明添加另一层重映射的其他一些键映射?
【问题讨论】:
-
这是哪个版本的 Emacs?对我来说,Emacs 26.1 报告
<M-left> (translated from <M-S-left>) runs the command left-word。您可能会看到相同的行为,而没有被明确告知这是一个翻译序列。 -
GNU Emacs 25.2.2
-
仅供参考,我刚刚在 25.3 中进行了测试(IIRC 只是 25.2 之上的一个安全补丁),我也在那里看到了“翻译自”文本。我觉得它已经存在了很长时间(可能自从引入了移位翻译功能以来),所以我仍然对为什么您自己没有看到它感到有些困惑。
-
我似乎确实记得自己在过去看到过“翻译自”消息(旧 Emacs 版本)。这就是我引用我得到的输出的前几行的原因,因为在我的版本中显然没有提到它。
标签: emacs