M-S- <left>未按预期处理

时间:2019-02-08 07:17:13

标签: emacs

当我在这样的终端中启动新的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- 的初始行为。 kbd>为<M-left>

这是怎么回事?这是配置问题,还是预期的行为,还是涉及其他一些透明映射添加了另一层重新映射的键映射?

1 个答案:

答案 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”会检查此变量的值,以   确定如何激活或停用该区域(*注   手柄移位选择:标记。)

相关问题