【求教】hydra 与 use-package 结合

defhydra hydra-media-player 放到 :config 后面应该就可以了

(use-package emms
  :commands (hydra-media-player/body)
  :config
  (defhydra hydra-media-player ()
    "emms"
    ("p" emms-pause               "pause/resume")
    ("l" emms-play-playlist       "playlist")
    ("f" emms-play-file           "song")
    ("d" emms-play-directory-tree "directory")
    (">" emms-next                "next")
    ("<" emms-previous            "previous")
    ("s" emms-stop                "stop")
    ("q" nil                      "quit"))

  (require 'emms-setup)
  (emms-standard)
  (emms-default-players))
1 个赞

确实可以诶,但不明白为什么,我的理解是 :config 里面的内容是在 emms 加载后才会运行,而 :commands 是绑定一个 command,当这个 command 被调用时,加载 emms。

但这段代码 :config 里定义的 hydra,为什么可以在 emms 没加载时调用呢?

这里我也不是特别清楚,但是 :init 中定义的话应该 autoload 无效,或者说不算那个 package 的 function,没法执行函数后加载 emms?

你将 use-package 宏展开之后应该就明白了。

(use-package A
    :commands a-cmd
    :config  
(defun a-cmd () xxxx))
;; 就是
(autoload 'a-cnd "A")
(eval-after-load 'A
      '(defun a-cmd() xxx))

当你第一次运行 a-cmd 时, 它会加载 A 包(如果 A 包在 load-path 中), 而加载 A 包 后会马上执行 (eval-after-load 'A xxxx)。 至于 :init 后的表达式是在 (require 'A) 之前执行的, 意味着 a-cmd 已经存在。

2 个赞