如何在Emacs中找到按键绑定的定义位置?

5
一些奇怪的事情发生了,shift + m在emacs中被绑定到了Meta键。现在我无法输入任何以M开头的单词,例如Mock。我想找出为什么会发生这种情况或者是哪个软件包导致了这个问题。
有一个关于这个问题的问题,但并没有解决这个问题。
我尝试了C h k m,它显示m runs command self-insert-command 但是当我尝试C h k M时,它会激活Meta键并等待另一个按键输入。 C h c M也是同样的情况。
有没有办法找出是什么导致了这个问题?
更新:
1. 我的emacs配置:https://github.com/ChillarAnand/.emacs.d 2. 问题不是发生在操作系统级别。如果我使用emacs -Q启动emacs,一切正常。

3
也许 meta-prefix-char 被设置为大写字母 M 了?如果可能的话,你可以在你的自定义设置和第三方库中搜索该变量。在我的电脑上,大写字母 M 对应的 ASCII 码是77。你可以使用 describe-variable 命令来检查该变量的值。 - lawlist
1
我猜这是(define-key smartparens-mode-map (kbd "M up") nil),它将M u p绑定到了nil。你真正想要的是(kbd "M-<up>") - npostavs
1
请注意,当您按下Meta键(或Ctrl键或任何其他修改键)时,Emacs不会等待另一个键。按下并释放修改键根本不起作用,因此“激活Meta键”是一个误导性的描述——这既不是正在发生的事情,也不是什么有意义的事情(除非调用event-apply-meta-modifier,但很难意外绑定到它)。 - phils
1
我仍在寻找这个标题的答案。 - CodyChan
2个回答

2
问题出在代码上。
(define-key smartparens-mode-map (kbd "M up") nil)
(define-key smartparens-mode-map (kbd "M down") nil)))

这不是将shift m绑定为Meta,而是将键序列M u pM d o w n绑定为nil。要在kbd中指定Meta,请使用M-{按键},要指定up,请使用<up>,对于所讨论的代码,请参考:
(define-key smartparens-mode-map (kbd "M-<up>") nil)
(define-key smartparens-mode-map (kbd "M-<down>") nil)))

4
那是解决你问题的方法,而不是对问题的回答。 - Atemu
2
@Atemu s/your/OP's/,但是没错。对于这个问题,实际上并没有一个好的答案,Emacs并没有记录那些信息。 - npostavs

1
在我的 .emacs 文件开头添加以下内容对我很有帮助:
(let ((old-func (symbol-function 'define-key))
      (bindings-buffer (get-buffer-create "*Bindings*")))
  (defun define-key (keymap key def)
    (with-current-buffer bindings-buffer
      (insert (format "%s -> %s\n" key def))
      (mapbacktrace (lambda (evald func args flags)
                      (insert (format "* %s\n" (cons func args))))))
    (funcall old-func keymap key def)))

请参见 https://stackoverflow.com/questions/15354894/how-to-find-the-location-where-an-an-emacs-lisp-function-is-bound-to-a-key/72253450 中有关其工作原理的说明。 - Edgar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接