From 3a319494833be7d34d9e7136f1a2713fcba60364 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 29 Jan 2018 16:55:23 -0500 Subject: [PATCH] Refactor doom! to support nested calls #352 Isolates doom! a little more to allow for nested doom! calls. --- core/core-packages.el | 44 +++++++++++++++++++------------------------ 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 7c1d9c936..719c2d806 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -54,7 +54,8 @@ this is nil after Emacs has started something is wrong.") (defvar doom-init-time nil "The time it took, in seconds, for DOOM Emacs to initialize.") -(defvar doom-modules () +(defvar doom-modules + (make-hash-table :test #'equal :size 90 :rehash-threshold 1.0) "A hash table of enabled modules. Set by `doom-initialize-modules'.") (defvar doom-packages () @@ -200,7 +201,7 @@ This aggressively reloads core autoload files." (file-relative-name file doom-emacs-dir) (error-message-string ex)))))) (when (or force-p (not doom-modules)) - (setq doom-modules nil + (setq doom-modules (clrhash doom-modules) doom-packages nil) (_load (concat doom-core-dir "core.el") nil 'interactive) (_load (expand-file-name "init.el" doom-emacs-dir)) @@ -214,20 +215,6 @@ This aggressively reloads core autoload files." for path = (doom-module-path module submodule "packages.el") do (_load path 'noerror)))))) -(defun doom-initialize-modules (modules) - "Adds MODULES to `doom-modules'. MODULES must be in mplist format. - - e.g '(:feature evil :lang emacs-lisp javascript java)" - (setq doom-modules (make-hash-table :test #'equal - :size (+ 5 (length modules)) - :rehash-threshold 1.0)) - (let (mode) - (dolist (m modules) - (cond ((keywordp m) (setq mode m)) - ((not mode) (error "No namespace specified on `doom!' for %s" m)) - ((listp m) (doom-module-enable mode (car m) (cdr m))) - (t (doom-module-enable mode m)))))) - (defun doom-module-path (module submodule &optional file) "Get the full path to a module: e.g. :lang emacs-lisp maps to ~/.emacs.d/modules/lang/emacs-lisp/ and will append FILE if non-nil." @@ -305,22 +292,29 @@ include all modules, enabled or otherwise." "Bootstrap DOOM Emacs. MODULES is an malformed plist of modules to load." - (doom-initialize-modules modules) `(let (file-name-handler-alist) + ,@(let (init-forms config-forms mode) + (dolist (m modules) + (cond ((keywordp m) (setq mode m)) + ((not mode) (error "No namespace specified in `doom!' for %s" m)) + (t + (let* ((module mode) + (submodule (if (listp m) (car m) m)) + (flags (if (listp m) (cdr m))) + (path (doom-module-path module submodule))) + (doom-module-enable module submodule flags) + (push `(load! init ,path t) init-forms) + (unless noninteractive + (push `(load! config ,path t) config-forms)))))) + (nconc (nreverse init-forms) + (nreverse config-forms))) (setq doom-modules ',doom-modules) (unless noninteractive - (message "Doom initialized") - ,@(cl-loop for (module . submodule) in (doom-module-pairs) - for module-path = (doom-module-path module submodule) - collect `(load! init ,module-path t) into inits - collect `(load! config ,module-path t) into configs - finally return (append inits configs)) (when (display-graphic-p) (require 'server) (unless (server-running-p) (server-start))) - (add-hook 'doom-post-init-hook #'doom-packages--display-benchmark) - (message "Doom modules initialized")))) + (add-hook 'doom-post-init-hook #'doom-packages--display-benchmark)))) (defmacro def-package! (name &rest plist) "A thin wrapper around `use-package'."