defhydra+ 导致Eager macro-expansion failure (已解决但发个帖)

(defhydra+ hydra-ivy ()
           ("a" nil)
           ("<escape>" keyboard-escape-quit :exit t)
           ("q" keyboard-escape-quit :exit t))

以上代码会在emacs启动时报error: Eager macro-expansion failure: (void-variable hydra-ivy/params),在doom里找到了解决办法:把这些放进一个eval里:

(eval '(defhydra+ hydra-ivy ()
           ("a" nil)
           ("<escape>" keyboard-escape-quit :exit t)
           ("q" keyboard-escape-quit :exit t)))

但doom里是用在其它macro上的,doom也用了defhydra+但并没有这个问题的样子。 @fuxialexander 搜代码的时候搜到你的了,看你把defhydra+注释掉了,大概也许是同样问题?

一般的做法是看下错误信息具体是哪个函数展开的时候出错的,然后把那个函数所在文件require一下。dooomemacs可能是因为lazy load用的比较激进导致改加载的包没加载

我完整的是这样的,已经在use-package的:config里了,等于require过了,但不加eval还是报错的

(use-package ivy-hydra
  :demand t
  :after (hydra ivy)
  :config
  ;; learned from doom: putting macro in eval avoids following error:
  ;; error: Eager macro-expansion failure: (void-variable hydra-ivy/params)
  (eval '(defhydra+ hydra-ivy ()
           ("a" nil)
           ("<escape>" keyboard-escape-quit :exit t)
           ("q" keyboard-escape-quit :exit t))))

我甚至把use-package展开了一下看看,:config确实是require之后 :joy:


哦查过一下,eager macro expansion就是在执行之前把所有能展开的全展开,然后再执行,也就是先展开了defhydra+,再require的,所以就报错了 吧