Refactor doom! to support nested calls #352

Isolates doom! a little more to allow for nested doom! calls.
This commit is contained in:
Henrik Lissner 2018-01-29 16:55:23 -05:00
parent 8deea285c5
commit 3a31949483
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395

View file

@ -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'."