今天尝试修改 Markdown 的快捷键绑定,想使用 M-n 1
绑定 markdown-insert-header
函数(可以在 insert mode 模式下直接调用,方便快捷),但是怎么搞都报 non-prefix key,不知道有没有哪位知道怎么搞?
因为 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
加载的快捷键,如何去加载?
这样都不性,很郁闷
上面已经说了
-
unbind-key
的第二个参数不是命令,而是 keymap - 请不要用截图贴代码,请使用 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小时后自动关闭。不再允许新的回复。