doom-modules: use hash-table instead of nested alist
This commit is contained in:
parent
5c79105be3
commit
b447f30038
1 changed files with 33 additions and 40 deletions
|
@ -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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue