(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应该注意什么?
(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))
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 .......))
好的,明白了。