什么是Emacs Lisp中的“with-eval-after-load”

时间:2014-02-19 12:12:46

标签: emacs macros elisp

我在尝试从here安装with-eval-after-load时遇到了宏persp-mode。但是我无法在Emacs和/或Google上找到宏。它在哪里定义?它是标准Emacs Lisp的一部分吗?

1 个答案:

答案 0 :(得分:43)

来自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时,您可以确定宏已定义并可供使用。这是discussed on emacs-devel