当我在这样的终端中启动新的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 终端(即不在Emacs中)产生
^[[1;4D
并在Emacs中键入 C-q C-S- ^[
是单个字符,即ASCII 27(“转义”)。)
检查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
,则随后调用 Ch k 并随后调用 MS-
运行行首命令(位于 lisp-interaction-mode-map),这是一个交互式内置函数 在“ C源代码”中。 它绑定到
。 [...]
将 MS- nil
将恢复 Ch k 报告 MS- <M-left>
。
这是怎么回事?这是配置问题,还是预期的行为,还是涉及其他一些透明映射添加了另一层重新映射的键映射?
答案 0 :(得分:2)
这是一个功能。
M-x elisp-index-search
RET shift-translation
说:
如果输入字符为大写(或具有shift修饰符),并且 没有键绑定,但是等效的小写字母有一个,然后 “读取键序列”将字符转换为小写。注意 “ lookup-key”不会以这种方式执行大小写转换。
当读取输入结果产生这种“移位翻译”时,Emacs设置 变量“ this-command-keys-shift-translated”转换为非“ nil”值。 Lisp程序可以在需要修改其变量时检查此变量。 由shift转换键调用时的行为。例如, 函数“ handle-shift-selection”会检查此变量的值,以 确定如何激活或停用该区域(*注 手柄移位选择:标记。)