spacemacs中如何绑定一个快捷键?

(defun qinshulei/post-init-avy ()
  (with-eval-after-load 'avy
    (global-set-key (kbd "C-;") 'avy-goto-word-or-subword-1)))

我尝试按上面的方法绑定,但不会立刻生效。必须执行一次avy-goto-word-or-subword-1才会生效。 似乎是和use-package有关,那么应该如何绑定快捷键?用use-package应该注意什么?

直接 (global-set-key (kbd “C-;”) 'avy-goto-word-or-subword-1) 就行了把。

必须执行一次avy-goto-word-or-subword-1才会生效

因为是 (with-eval-after-load 'avy xxx), 第一次用avy之前这个feature还没有载入,就不会执行你的 global-set-key.

快捷键绑定不应该放在 with-eval-after-load

要是绑定一个minor-mode-map的快捷键应该可以写在eval-after-load里吧

那应该需要加

那什么情况需要 with-eval-after-load 呢?

如果你想为某个 major/minor mode 加个 kbd 或者对某个 lib 做些定制,可以用 with-eval-after-load,比如如果想给 org-mode 加个 kbd,那么可以:

(with-eval-after-load 'org
  (define-key org-mode-map (kbd "some key sequence") #'some-org-command))

如果用 Spacemacs 的话,这种情况也可以用 spacemacs|use-package-add-hook

(spacemacs|use-package-add-hook org
  :post-config
   (define-key org-mode-map (kbd "some key sequence") #'some-org-command))
2 个赞

with-eval-after-load 是在被彻底加载后才被执行的,例如 (with-eval-after-load 'org 只有在 org 被 require 或者第一次加载 org-mode 时才会被执行。所以如果是公共按键不适合使用(此时 org 没有被加载)

这里的情况是设置全局的按键绑定。spacemacs对这些全局的默认也是使用到了才会加载?这是如何做到的呢?

avy-goto-word-or-subword-1 spacemacs 绑定了 space space

Spacemacs 是在 use-package:init 里面用 spacemacs/set-leader-keys(在此上下文中可以说和 global-set-key 类似)设置的 kbd,:init 是在相应的包被加载之前执行的。

你这里在 post-init-PKG 里面做也可以,就是把 with-eval-after-load 去掉就可以了

不过,我觉得这种 global-set-key 没必要单独做个 config layer ,直接放在 .spacemacs 里面就可以了吧;如果是想在只有激活了 avy 的情况下才设置这个 kbd,那么可以这样:

(if (configuration-layer/package-usedp 'avy) (global-set-key .......))
1 个赞

好的,明白了。