Key sequence M-n 1 starts with non-prefix key M-n 如何解决?

今天尝试修改 Markdown 的快捷键绑定,想使用 M-n 1 绑定 markdown-insert-header 函数(可以在 insert mode 模式下直接调用,方便快捷),但是怎么搞都报 non-prefix key,不知道有没有哪位知道怎么搞?

1 个赞

因为 M-n 已经占用了,你还想绑定 M-n 1,就算 Emacs 不报错,你也用不了它。

你可以把 M-n 解除掉:

(unbind-key "M-n" markdown-mode-map)

然后再设置你的按键:

(bind-key "M-n 1" 'emacs-version)

谢谢,很管用;但是还有一个小问题;如何去绑定随着mode加载的快捷键

比如,M-n是随着markdown mode加载的快捷键,如何去加载?

image

这样都不性,很郁闷

上面已经说了

image

image

  1. unbind-key 的第二个参数不是命令,而是 keymap
  2. 请不要用截图贴代码,请使用 Markdown 语法。

Major mode中的快捷键 尽量不要用 global-set-key 来绑 或覆盖。

因为在emacs中每一个主模式,都是配置一个寄宿于它的快捷键组来定义只属于在这个 major mode 下才使用的快捷键,这个快捷键组可以叫做 key-map , 每一个 major mode 都有自己的 key-map ,比如在你所用的markdown-mode中它的key-map 叫做 markdown-mode-map ;在org-mode中叫做 org-mode-map ,其他以此类推。你可以使用 C-h v markdown-mode-map RET 查看markdown的key-map,至于其中的数字怎么反推快键键,还请各位大佬帮忙解释,我不懂。

所以你想用 global-set-key 去取消一个 key-map 下的快捷键是没用的,因为key-map中的快捷键只有在开启匹配的主模式的buffer中才有效,并且如果与全局快捷键冲突,会覆盖掉它。

因此应该使用 define-key 这个函数来擦除或设置一个主模式 key-map 中的快捷键。

形式如下:

  • 从一个markdown-mode中的key-map中取消一个快捷键绑定:
(define-key markdown-mode-map (kbd "M-n") 'nil)
  • 如果想要在某一个mode-map中绑定
(define-key markdown-mode-map (kbd "M-n") 'save-buffers-kill-terminal)

最终根据各位大佬的提示,google了一下,用以下代码完美解决了; 在:bin区域中定义快捷键的好处是,可以在describe-personal-keybindings中查到自己定义的快捷键

(defun pan/post-init-markdown-mode ()
  (with-eval-after-load 'markdown-mode
    (use-package markdown-mode
      :init
      (add-hook 'markdown-mode-hook
                (lambda ()
                  (local-unset-key (kbd "M-n"))
                  ;; (define-key markdown-mode-map (kbd "M-n 1") 'markdown-insert-header)
                )
      )
      :bind (
             ("M-n h" . markdown-insert-header)
      )
    )
  )
)

谢谢大家!

该主题在创建6小时后自动关闭。不再允许新的回复。