From 589108fdb270f24a98ba6209f6955fe41530b3ef Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Feb 2018 17:04:48 -0500 Subject: [PATCH] Extend after! macro to support :any, :all & feature lists #442 --- core/core-lib.el | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 37db56584..ac3cc00ec 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -59,17 +59,31 @@ (defalias 'lambda! 'λ!) -(defmacro after! (feature &rest forms) +(defmacro after! (features &rest body) "A smart wrapper around `with-eval-after-load'. Supresses warnings during compilation." (declare (indent defun) (debug t)) - `(,(if (or (not (bound-and-true-p byte-compile-current-file)) - (if (symbolp feature) - (require feature nil :no-error) - (load feature :no-message :no-error))) - #'progn - #'with-no-warnings) - (with-eval-after-load ',feature ,@forms))) + (list (if (or (not (bound-and-true-p byte-compile-current-file)) + (dolist (next (doom-enlist features)) + (if (symbolp next) + (require next nil :no-error) + (load next :no-message :no-error)))) + #'progn + #'with-no-warnings) + (cond ((symbolp features) + `(eval-after-load ',features '(progn ,@body))) + ((and (consp features) + (memq (car features) '(:or :any))) + `(progn + ,@(cl-loop for next in (cdr features) + collect `(after! ,next ,@body)))) + ((and (consp features) + (memq (car features) '(:and :all))) + (dolist (next (cdr features)) + (setq body `(after! ,next ,@body))) + body) + ((listp features) + `(after! (:all ,@features) ,@body))))) (defmacro quiet! (&rest forms) "Run FORMS without making any noise."