doom-modules: use hash-table instead of nested alist

This commit is contained in:
Henrik Lissner 2017-02-13 04:47:20 -05:00
parent 5c79105be3
commit b447f30038

View file

@ -47,8 +47,7 @@ if you have byte-compiled your configuration (as intended). Running
`doom-initialize' sets this.") `doom-initialize' sets this.")
(defvar doom-modules nil (defvar doom-modules nil
"Alist of enabled modules; each element is a list, whose CAR is a module "A hash table of enabled modules.")
keyword, and whose CDR is a list of submodule symbols.")
(defvar doom-packages nil (defvar doom-packages nil
"A list of enabled packages. Each element is a sublist, whose CAR is the "A list of enabled packages. Each element is a sublist, whose CAR is the
@ -161,6 +160,27 @@ and `doom-packages'."
(--map (doom-module-path (car it) (cdr it) "packages.el") (--map (doom-module-path (car it) (cdr it) "packages.el")
(doom--module-pairs)))))) (doom--module-pairs))))))
(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)"
(unless doom-modules
(setq doom-modules (make-hash-table :test 'equal :size (length modules))))
(let (mode)
(dolist (m modules)
(cond ((keywordp m)
(setq mode m))
((not mode)
(error "No namespace specified on `@doom' for %s" m))
((eq m '*)
(let ((mode-str (substring (symbol-name mode) 1)))
(doom-initialize-modules
(cons mode
(--map (intern (f-base it))
(f-directories (f-expand mode-str doom-modules-dir)))))))
(t
(doom--enable-module mode m))))))
(defun doom-module-path (module submodule &optional file) (defun doom-module-path (module submodule &optional file)
"Get the full path to a module: e.g. :lang emacs-lisp maps to "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." ~/.emacs.d/modules/lang/emacs-lisp/ and will append FILE if non-nil."
@ -174,17 +194,16 @@ and `doom-packages'."
doom-modules-dir))) doom-modules-dir)))
(defun doom-module-loaded-p (module submodule) (defun doom-module-loaded-p (module submodule)
"Returns t if SUBMODULE (in MODULE) is present in `doom-modules'." "Returns t if MODULE->SUBMODULE is present in `doom-modules'."
(and (memq submodule (cdr (assq module doom-modules))) (gethash (cons module submodule) doom-modules))
t))
(defun doom--module-pairs () (defun doom--module-pairs ()
"Returns `doom-modules' as a list of (MODULE . SUBMODULE) cons cells." "Returns `doom-modules' as a list of (MODULE . SUBMODULE) cons cells. The list
(let (pairs module) is sorted by order of insertion."
(dolist (modules doom-modules) (let (pairs)
(setq module (car modules)) (maphash (lambda (key value)
(dolist (submodule (cdr modules)) (setq pairs (append pairs (list (cons (car key) (cdr key))))))
(push (cons module submodule) pairs))) doom-modules)
pairs)) pairs))
(defun doom--enable-module (module submodule &optional force-p) (defun doom--enable-module (module submodule &optional force-p)
@ -194,32 +213,7 @@ FORCE-P is non-nil). MODULE is a keyword, SUBMODULE is a symbol. e.g. :lang
Used by `@require' and `@depends-on'." Used by `@require' and `@depends-on'."
(unless (or force-p (doom-module-loaded-p module submodule)) (unless (or force-p (doom-module-loaded-p module submodule))
(let ((sublist (assq module doom-modules))) (puthash (cons module submodule) t doom-modules)))
(if sublist
(setcdr (last sublist) (list submodule))
(push (list module submodule) doom-modules)))))
(defun doom--enable-modules (modules)
"Adds MODULES to `doom-modules'.
MODULES must be in mplist format:
'(:feature evil :lang emacs-lisp javascript java)"
(let (mode)
(dolist (m modules)
(cond ((keywordp m)
(setq mode m))
((not mode)
(error "No namespace specified on `@doom' for %s" m))
((eq m '*)
(let ((mode-str (substring (symbol-name mode) 1)))
(doom--enable-modules
(cons mode
(--map (intern (f-base it))
(f-directories
(f-expand mode-str doom-modules-dir)))))))
(t
(doom--enable-module mode m))))
doom-modules))
;; ;;
@ -231,13 +225,12 @@ MODULES must be in mplist format:
(defmacro @doom (&rest modules) (defmacro @doom (&rest modules)
"DOOM Emacs bootstrap macro. List the modules to load. Benefits from "DOOM Emacs bootstrap macro. List the modules to load. Benefits from
byte-compilation." byte-compilation."
(doom--enable-modules modules) (doom-initialize-modules modules)
(unless noninteractive (unless noninteractive
`(let (file-name-handler-alist) `(let (file-name-handler-alist)
(setq doom-modules ',doom-modules) (setq doom-modules ',doom-modules)
,@(mapcar (lambda (pkg) ,@(mapcar (lambda (module) `(@require ,(car module) ,(cdr module) t))
`(@require ,(car pkg) ,(cdr pkg) t))
(doom--module-pairs)) (doom--module-pairs))
(when (display-graphic-p) (when (display-graphic-p)