spacemacs更改快捷键

用了大半年的spacemacs,确实感受到了什么叫操作系统级别的编译器,头疼不会Lisp语言,要想按自己的想法配置下,基本都是照葫芦画瓢;今天看了下markdown-mode,感觉有很多快捷还是挺常用的,但是原始设计的按键弧度太长,而却leader-keySPC,意味着必须要退出insert-mode才能使用……

尝试自定义快捷键

首先想到的当然是尝试在自定义的layer中,再加载一遍markdown-mode;使用了几种不同的Lisp代码,尝试加载自定义的快捷键

初始化markdown-mode时绑定快捷键

(defun pan/init-markdown-mode()
  (use-package markdown-mode
    :defer t
    :init
    :bind (("M-n 1" . markdown-insert-header)
           )
    ))

结果如下:

err

尝试修正错误

  • 根据错误提示应该是M-n 1快捷键已经绑定了其它函数了,不能再次绑定了,于是想到了先情空该快捷键
(global-set-key (kbd "M-n 1") 'nil)
  • 于是修改代码如下
(global-set-key (kbd "M-n 1") 'nil)
(defun pan/init-markdown-mode()
  (use-package markdown-mode
    :defer t
    :init
    :bind (("M-n 1" . markdown-insert-header)
           )
    ))

问题依旧,错误提示也是一样的。。

换个快捷键

  • non-prefix key大概的意思就是M-n不是一个快捷键的前缀,而就是一个快捷键;

  • 通过C-h k查询了下M-n绑定的函数,是markdown-next-link,也就是说该快捷键只有在markdown mode被加载时才会生效,无法使用global-set-key去绑定

  • 尝试使用M-r 1(因为M-r似乎无关紧要)

(defun pan/init-markdown-mode()
  (use-package markdown-mode
    :defer t
    :init
    :bind (("M-r 1" . markdown-insert-header)
           )
    ))

测试是不报错了,但是并没有生效。。

final slove

最终综合前面两种方法

  • 选择M-r为快捷键前缀(该快捷键是emacs默认的,启动即加载,方便去加载)

  • 先去绑定emacs绑定的默认函数,再绑定我们自定义的函数

  • 代码如下

(global-set-key (kbd "M-r") 'nil)
(defun pan/init-markdown-mode ()
  (use-package markdown-mode
    :init
    :config
    ;; (use-package moccur-edit)
;;    (unbind-key "M-n" markdown-next-link)
   :bind
   (
    ("M-r -" . org-ctrl-c-minus)
    ("M-r h" . markdown-insert-header)
    ("M-r 1" . markdown-insert-header-atx-1)
    ("M-r 2" . markdown-insert-header-atx-2)
    ("M-r 3" . markdown-insert-header-atx-3)
    ("M-r l" . markdown-insert-link-button)
    ("M-r u" . markdown-insert-uri)
   ;; ("M-r t" . markdown-toc-generate-toc)
    ("M-r t" . table-insert)
    ("M-r c" . markdown-insert-gfm-code-block)
    ("M-r q" . markdown-insert-blockquote)
    ("M-r q" . markdown-insert-blockquote)
    ("M-r i" . markdown-insert-italic)
    ("M-r b" . markdown-insert-bold)
   )
))

遗留问题

  • 如何去绑定package自定义延时加载的快捷键, 如下代码会报错
(defun pan/init-markdown-mode ()
  (use-package markdown-mode
    :init
    :config
        (unbind-key "M-n" markdown-next-link)
    :bind
       (
           ("M-r -" . org-ctrl-c-minus)
       ) 
))

遗留问题解决

  • :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)
      )
    )
  )
)

参考链接

emacs china

stackoverflow