我在尝试从这里安装persp-mode
时,遇到了宏with-eval-after-load
。但是我无法在Emacs和/或Google中找到该宏。它定义在哪里?它是标准的Emacs Lisp的一部分吗?
来自etc/NEWS
:
* Lisp Changes in Emacs 24.4
...
** New macro `with-eval-after-load'.
This is like the old `eval-after-load', but better behaved.
Emacs 24.4 在2014年10月20日发布。
eval-after-load
被认为是不规范的,因为它是一个函数而不是宏,所以需要引用它内部的代码,这意味着它不能被字节编译。它也只接受一个表达式,如果你有多个表达式,就需要使用 progn
。例如:
(eval-after-load "foo"
'(progn
(setq foo 42)
(setq bar 17)))
使用 with-eval-after-load
的等效版本如下:
(with-eval-after-load "foo"
(setq foo 42)
(setq bar 17))
正如评论中Clément所指出的,使用with-eval-after-load
的一个缺点是无法依赖于模块中定义的宏,而使用eval-after-load
则可以确定该类宏已被定义且可供使用。这个问题在emacs-devel邮件列表上进行了讨论。
NEWS
中给出的原因。 - Drewwith-eval-after-load
会安排对其主体进行字节编译,而eval-after-load
则不会。这也是它被添加的主要原因。 - user355252LIBRARY
时评估BODY
;而eval-after-load
的目标之一就是不要这样做。 - DrewBODY
确实会有不同。请参考Emacs bug #16810。 - Drew