doomemacs/core/autoload/set.el
2017-02-20 00:26:07 -05:00

41 lines
1.4 KiB
EmacsLisp

;;; set.el
(provide 'doom-lib-set)
;; This provides a centralized configuration system that a) won't evaluate its
;; arguments if it doesn't need to (performance), b) won't complain if the
;; setting doesn't exist and c) is more elegant than a bunch of `@after' blocks,
;; which can cause intermittent stuttering in large quantities. I'm a fan of
;; concise, do-what-I-mean front-facing configuration, believe it or not.
;;
;; Plus, it can benefit from byte-compilation.
;;;###autoload
(defmacro @def-setting (keyword arglist &optional docstring &rest forms)
"Define a setting macro. Like `defmacro', this should return a form to be
executed when called with `@set'. FORMS are not evaluated until `@set' calls it."
(declare (indent defun) (doc-string 3))
(unless (keywordp keyword)
(error "Not a valid property name: %s" keyword))
`(defun ,(intern (format "doom-setting--setter%s" keyword)) ,arglist
,docstring
,@forms))
;;;###autoload
(defmacro @set (keyword &rest values)
"Set an option defined by `@def-setting'. Skip if doesn't exist."
(declare (indent defun))
(unless values
(error "Empty @set for %s" keyword))
(let ((fn (intern (format "doom-setting--setter%s" keyword))))
(if (functionp fn)
(apply fn (eval `(list ,@values)))
(when doom-debug-mode
(warn "No setting found for %s" keyword)))))
;; (defun describe-setting ()
;; (interactive)
;; ;; TODO
;; (error "Not implemented yet"))