From 428f1e1d07c80243be3e47921cae569cb077978a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 16:23:50 +0200 Subject: [PATCH] Refactor def-setting!/set! implementation The `doom-settings` variable has been removed. Setting checks are done with fboundp now, which is simpler. --- core/autoload/help.el | 17 ++++++++++++----- core/core-packages.el | 28 ++++++++++------------------ core/test/core-lib.el | 7 +++---- 3 files changed, 25 insertions(+), 27 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index 783492d12..b2d8f431b 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -68,13 +68,20 @@ Defaults to the " (interactive - (let ((sym (symbol-at-point))) + (let ((settings (cl-loop with case-fold-search = nil + for sym being the symbols of obarray + for sym-name = (symbol-name sym) + if (string-match "^doom--set\\(:.+\\)" sym-name) + collect (match-string 1 sym-name))) + (sym (symbol-at-point))) (list (completing-read "Describe setting: " - (sort (mapcar #'car doom-settings) #'string-lessp) + (sort settings #'string-lessp) nil t (if (keywordp sym) (symbol-name sym)))))) - (let ((fn (cdr (assq (intern setting) doom-settings)))) - (unless fn - (error "'%s' is not a valid DOOM setting" setting)) + (or (stringp setting) + (signal 'wrong-type-argument (list 'stringp setting))) + (let ((fn (intern-soft (format "doom--set%s" setting)))) + (or (fboundp fn) + (error "'%s' is not a valid DOOM setting" setting)) (describe-function fn))) ;;;###autoload diff --git a/core/core-packages.el b/core/core-packages.el index 3c34f09fd..c459e65d1 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -806,9 +806,6 @@ loads MODULE SUBMODULE's packages.el file." ;; `set!'. If a setting doesn't exist at runtime, the `set!' call is ignored and ;; its arguments are left unevaluated (and entirely omitted when byte-compiled). -(defvar doom-settings nil - "An alist mapping setting keywords to functions.") - (defmacro def-setting! (keyword arglist &optional docstring &rest forms) "Define a setting. Like `defmacro', this should return a form to be executed when called with `set!'. FORMS are not evaluated until `set!' calls it. @@ -817,14 +814,10 @@ See `doom/describe-setting' for a list of available settings. Do not use this for configuring Doom core." (declare (indent defun) (doc-string 3)) - (unless (keywordp keyword) - (error "Not a valid property name: %s" keyword)) - (let ((fn (intern (format "doom--set%s" keyword)))) - `(progn - (defun ,fn ,arglist - ,docstring - ,@forms) - (map-put doom-settings ,keyword #',fn)))) + (or (keywordp keyword) + (signal 'wrong-type-argument (list 'keywordp keyword))) + `(fset ',(intern (format "doom--set%s" keyword)) + (lambda ,arglist ,docstring ,@forms))) (defmacro set! (keyword &rest values) "Set an option defined by `def-setting!'. Skip if doesn't exist. See @@ -832,13 +825,12 @@ Do not use this for configuring Doom core." VALUES doesn't get evaluated if the KEYWORD setting doesn't exist." (declare (indent defun)) - (unless values - (error "Empty set! for %s" keyword)) - (if-let* ((fn (cdr (assq keyword doom-settings)))) - (apply fn values) - (when doom-debug-mode - (message "No setting found for %s" keyword) - nil))) + (let ((fn (intern-soft (format "doom--set%s" keyword)))) + (if (and fn (fboundp fn)) + (apply fn values) + (when doom-debug-mode + (message "No setting found for %s" keyword) + nil)))) (provide 'core-packages) ;;; core-packages.el ends here diff --git a/core/test/core-lib.el b/core/test/core-lib.el index 10a9d6ee3..bf1d1a934 100644 --- a/core/test/core-lib.el +++ b/core/test/core-lib.el @@ -107,11 +107,10 @@ (def-test! set (eval-and-compile - (let (doom-settings) - (def-setting! :-test-setting (x) `(setq result ,x)) - (should (assq :-test-setting doom-settings)) + (def-setting! :-test-setting (x) `(setq result ,x)) + (should (fboundp 'doom--set:-test-setting)) (let ((inhibit-message t) result) (set! :-test-setting t) (should result) - (set! :non-existant-setting (error "This shouldn't trigger")))))) + (set! :non-existant-setting (error "This shouldn't trigger")))))