Add :if, :when, :unless & :cond support to doom! macro

Now you can conditionally enable/disable modules.
This commit is contained in:
Henrik Lissner 2019-07-26 12:05:13 +02:00
parent 321b797046
commit e6201ca952
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
3 changed files with 56 additions and 12 deletions

View file

@ -229,8 +229,6 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See
(put :mode 'lisp-indent-function 'defun) (put :mode 'lisp-indent-function 'defun)
(put :prefix 'lisp-indent-function 'defun) (put :prefix 'lisp-indent-function 'defun)
(put :prefix-map 'lisp-indent-function 'defun) (put :prefix-map 'lisp-indent-function 'defun)
(put :unless 'lisp-indent-function 'defun)
(put :when 'lisp-indent-function 'defun)
;; specials ;; specials
(defvar doom--map-forms nil) (defvar doom--map-forms nil)

View file

@ -322,6 +322,10 @@ This value is cached. If REFRESH-P, then don't use the cached value."
;; ;;
;;; Module config macros ;;; Module config macros
(put :if 'lisp-indent-function 2)
(put :when 'lisp-indent-function 'defun)
(put :unless 'lisp-indent-function 'defun)
(defmacro doom! (&rest modules) (defmacro doom! (&rest modules)
"Bootstraps DOOM Emacs and its modules. "Bootstraps DOOM Emacs and its modules.
@ -353,17 +357,29 @@ for a list of all recognized module trees. Order defines precedence (from most
to least)." to least)."
(unless (keywordp (car modules)) (unless (keywordp (car modules))
(setq modules (eval modules t))) (setq modules (eval modules t)))
(unless doom-modules (let ((doom-modules
(setq doom-modules (make-hash-table :test 'equal
(make-hash-table :test 'equal :size (if modules (length modules) 150)
:size (if modules (length modules) 150) :rehash-threshold 1.0))
:rehash-threshold 1.0))) (inhibit-message doom-inhibit-module-warnings)
(let ((inhibit-message doom-inhibit-module-warnings)
category m) category m)
(while modules (while modules
(setq m (pop modules)) (setq m (pop modules))
(cond ((keywordp m) (setq category m)) (cond ((keywordp m) (setq category m))
((not category) (error "No module category specified for %s" m)) ((not category) (error "No module category specified for %s" m))
((and (listp m)
(keywordp (car m)))
(pcase (car m)
(:cond
(cl-loop for (cond . mods) in (cdr m)
if (eval cond t)
return (prependq! modules mods)))
(:if (if (eval (cadr m) t)
(push (caddr m) modules)
(prependq! modules (cdddr m))))
(fn (if (or (eval (cadr m) t)
(eq fn :unless))
(prependq! modules (cddr m))))))
((catch 'doom-modules ((catch 'doom-modules
(let* ((module (if (listp m) (car m) m)) (let* ((module (if (listp m) (car m) m))
(flags (if (listp m) (cdr m)))) (flags (if (listp m) (cdr m))))
@ -387,10 +403,10 @@ to least)."
(throw 'doom-modules t)))) (throw 'doom-modules t))))
(if-let (path (doom-module-locate-path category module)) (if-let (path (doom-module-locate-path category module))
(doom-module-set category module :flags flags :path path) (doom-module-set category module :flags flags :path path)
(message "WARNING Couldn't find the %s %s module" category module)))))))) (message "WARNING Couldn't find the %s %s module" category module)))))))
(when noninteractive (when noninteractive
(setq doom-inhibit-module-warnings t)) (setq doom-inhibit-module-warnings t))
`(setq doom-modules ',doom-modules)) `(setq doom-modules ',doom-modules)))
(defvar doom-disabled-packages) (defvar doom-disabled-packages)
(define-obsolete-function-alias 'def-package! 'use-package!) ; DEPRECATED (define-obsolete-function-alias 'def-package! 'use-package!) ; DEPRECATED

View file

@ -82,6 +82,36 @@ It is integrated into Helpful, in Doom.
:background "red" :weight bold))) :background "red" :weight bold)))
#+END_SRC #+END_SRC
* doom!
#+BEGIN_SRC elisp :eval no
(doom! :completion
company
ivy
;;helm
:tools
(:if IS-MAC macos)
docker
lsp
:lang
(cc +lsp)
(:cond ((string= system-name "work-pc")
python
rust
web)
((string= system-name "writing-pc")
(org +dragndrop)
ruby))
(:if IS-LINUX
(web +lsp)
web)
:config
literate
(default +bindings +smartparens))
#+END_SRC
* file-exists-p! * file-exists-p!
#+BEGIN_SRC elisp #+BEGIN_SRC elisp
(file-exists-p! "init.el" doom-emacs-dir) (file-exists-p! "init.el" doom-emacs-dir)