From 194490680a39418ab54a9abc10ba147e1735a3d7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 3 Feb 2017 08:01:45 -0500 Subject: [PATCH] Add core-set, def-setting! and set!; standardized settings --- core/core-popups.el | 35 +++++++++++++++-------------------- core/core-set.el | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 20 deletions(-) create mode 100644 core/core-set.el diff --git a/core/core-popups.el b/core/core-popups.el index c48bfb94b..dd7df3c5c 100644 --- a/core/core-popups.el +++ b/core/core-popups.el @@ -21,29 +21,24 @@ (setq shackle-default-alignment 'below shackle-select-reused-windows t) - (defmacro def-popup! (&rest rules) - "Define one or more popup rules. See `shackle-rules' for the format of these -rules. If :align is omitted, it will use `shackle-default-alignment'." - (declare (indent 0)) - (macroexp-progn - (mapcar (lambda (rule) - ;; Ensure some default attributes are set for window rules - (let ((pattern (car rule)) - (ruleset (cdr rule))) - ;; Align popups by default (error if this doesn't happen) - (unless (plist-member ruleset :align) - (plist-put ruleset :align shackle-default-alignment)) - ;; Select popups by default - (unless (or (plist-member ruleset :select) - (plist-member ruleset :noselect)) - (plist-put ruleset :select t)) - (setq rule (append (list pattern) ruleset)) - `(push ',rule shackle-rules))) - rules))) + (def-setting! :popup (rule) + "Prepend a new popup rule to `shackle-rules'." + ;; Ensure some default attributes are set for window rules + (let ((pattern (car rule)) + (ruleset (cdr rule))) + ;; Align popups by default (error if this doesn't happen) + (unless (plist-member ruleset :align) + (plist-put ruleset :align shackle-default-alignment)) + ;; Select popups by default + (unless (or (plist-member ruleset :select) + (plist-member ruleset :noselect)) + (plist-put ruleset :select t)) + (setq rule (append (list pattern) ruleset)) + `(push ',rule shackle-rules))) ;; :noesc and :modeline are custom settings and are not part of shackle. See ;; `doom*popup-init' and `doom-popup-buffer' for how they're used. - (def-popup! + (set! :popup ("^ ?\\*doom:.+\\*$" :size 35 :regexp t :modeline t) ("^ ?\\*doom .+\\*$" :size 12 :noselect t :regexp t :modeline t) ("^\\*.+-Profiler-Report .+\\*$" :size 0.3 :regexp t) diff --git a/core/core-set.el b/core/core-set.el new file mode 100644 index 000000000..f2f9342fd --- /dev/null +++ b/core/core-set.el @@ -0,0 +1,36 @@ +;;; core-set.el + +;; When we switch out feature modules, I don't want certain config segments to +;; casue errors. This gives a + +(define-key help-map "\C-s" 'doom/describe-setting) + +(defvar doom-settings nil + "An alist of settings, mapping setting keywords to setter functions, which can +be a lambda or symbol.") + +(defmacro def-setting! (keyword arglist &optional docstring &rest body) + "Define a setting macro. Takes the same arguments as `defmacro'. This should +return forms, which will be run when `set!' is used to call this setting." + (declare (indent defun)) + (unless (keywordp keyword) + (error "Not a valid property name: %s" name)) + (let ((sym (intern (format "doom--set%s" keyword)))) + (setq doom-settings (assq-delete-all keyword doom-settings)) + `(push (cons ,keyword + (defun ,sym ,arglist + ,docstring + ,@body)) + doom-settings))) + +(defmacro set! (keyword &rest rest) + "Set an option defined by `doom-define-settings'. Skip if doesn't exist." + (declare (indent defun)) + (let ((set-fn (cdr (assq keyword doom-settings)))) + (when set-fn + (macroexp-progn + (mapcar (lambda (&rest args) (apply set-fn args)) + rest))))) + +(provide 'core-set) +;;; core-set.el ends here