diff --git a/core/core-lib.el b/core/core-lib.el index 819f5f99b..e695cf907 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -133,6 +133,56 @@ aliases." (when-let (path (file!)) (directory-file-name (file-name-directory path)))) +(defmacro after! (package &rest body) + "Evaluate BODY after PACKAGE have loaded. + +PACKAGE is a symbol or list of them. These are package names, not modes, +functions or variables. It can be: + +- An unquoted package symbol (the name of a package) + (after! helm BODY...) +- An unquoted list of package symbols (i.e. BODY is evaluated once both magit + and git-gutter have loaded) + (after! (magit git-gutter) BODY...) +- An unquoted, nested list of compound package lists, using any combination of + :or/:any and :and/:all + (after! (:or package-a package-b ...) BODY...) + (after! (:and package-a package-b ...) BODY...) + (after! (:and package-a (:or package-b package-c) ...) BODY...) + Without :or/:any/:and/:all, :and/:all are implied. + +This is a wrapper around `eval-after-load' that: + +1. Suppresses warnings for disabled packages at compile-time +2. No-ops for package that are disabled by the user (via `package!') +3. Supports compound package statements (see below) +4. Prevents eager expansion pulling in autoloaded macros all at once" + (declare (indent defun) (debug t)) + (if (symbolp package) + (unless (memq package (bound-and-true-p doom-disabled-packages)) + (list (if (or (not (bound-and-true-p byte-compile-current-file)) + (require package nil 'noerror)) + #'progn + #'with-no-warnings) + (let ((body (macroexp-progn body))) + `(if (featurep ',package) + ,body + ;; We intentionally avoid `with-eval-after-load' to prevent + ;; eager macro expansion from pulling (or failing to pull) in + ;; autoloaded macros/packages. + (eval-after-load ',package ',body))))) + (let ((p (car package))) + (cond ((not (keywordp p)) + `(after! (:and ,@package) ,@body)) + ((memq p '(:or :any)) + (macroexp-progn + (cl-loop for next in (cdr package) + collect `(after! ,next ,@body)))) + ((memq p '(:and :all)) + (dolist (next (cdr package)) + (setq body `((after! ,next ,@body)))) + (car body)))))) + (defmacro setq! (&rest settings) "A stripped-down `customize-set-variable' with the syntax of `setq'. diff --git a/core/core-modules.el b/core/core-modules.el index 79b16cb32..b4ff99504 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -540,56 +540,6 @@ CATEGORY and MODULE can be omitted When this macro is used from inside a module (memq category (doom-module-get (car module) (cdr module) :flags))))) t)) -(defmacro after! (package &rest body) - "Evaluate BODY after PACKAGE have loaded. - -PACKAGE is a symbol or list of them. These are package names, not modes, -functions or variables. It can be: - -- An unquoted package symbol (the name of a package) - (after! helm BODY...) -- An unquoted list of package symbols (i.e. BODY is evaluated once both magit - and git-gutter have loaded) - (after! (magit git-gutter) BODY...) -- An unquoted, nested list of compound package lists, using any combination of - :or/:any and :and/:all - (after! (:or package-a package-b ...) BODY...) - (after! (:and package-a package-b ...) BODY...) - (after! (:and package-a (:or package-b package-c) ...) BODY...) - Without :or/:any/:and/:all, :and/:all are implied. - -This is a wrapper around `eval-after-load' that: - -1. Suppresses warnings for disabled packages at compile-time -2. No-ops for package that are disabled by the user (via `package!') -3. Supports compound package statements (see below) -4. Prevents eager expansion pulling in autoloaded macros all at once" - (declare (indent defun) (debug t)) - (if (symbolp package) - (unless (memq package (bound-and-true-p doom-disabled-packages)) - (list (if (or (not (bound-and-true-p byte-compile-current-file)) - (require package nil 'noerror)) - #'progn - #'with-no-warnings) - (let ((body (macroexp-progn body))) - `(if (featurep ',package) - ,body - ;; We intentionally avoid `with-eval-after-load' to prevent - ;; eager macro expansion from pulling (or failing to pull) in - ;; autoloaded macros/packages. - (eval-after-load ',package ',body))))) - (let ((p (car package))) - (cond ((not (keywordp p)) - `(after! (:and ,@package) ,@body)) - ((memq p '(:or :any)) - (macroexp-progn - (cl-loop for next in (cdr package) - collect `(after! ,next ,@body)))) - ((memq p '(:and :all)) - (dolist (next (cdr package)) - (setq body `((after! ,next ,@body)))) - (car body)))))) - ;; DEPRECATED (defmacro def-package! (&rest args) (message "`def-package!' was renamed to `use-package!'; use that instead.")