From 5501b949efc964c4ce0eef89f0a7adcd841a3ef4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 11:34:19 +0200 Subject: [PATCH] Refactor def-project-mode! with cl-defmacro --- core/core-projects.el | 42 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/core/core-projects.el b/core/core-projects.el index 4446b28ec..b34634783 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -140,7 +140,15 @@ state are passed in.") unless (symbol-value mode) do (funcall mode))))) -(defmacro def-project-mode! (name &rest plist) +(cl-defmacro def-project-mode! (name &key + modes + files + when + match + add-hooks + on-load + on-enter + on-exit) "Define a project minor-mode named NAME (a symbol) and declare where and how it is activated. Project modes allow you to configure 'sub-modes' for major-modes that are specific to a specific folder, certain project structure, @@ -175,37 +183,25 @@ should be activated. If they are *all* true, NAME is activated. :on-exit FORM -- FORM is run each time the mode is disabled. Relevant: `doom-project-hook'." - (declare (indent 1) (doc-string 2)) - (let ((doc-string (if (stringp (car plist)) - (prog1 (car plist) - (setq plist (cdr plist))) - "A project minor mode.")) - (modes (plist-get plist :modes)) - (files (plist-get plist :files)) - (when (plist-get plist :when)) - (match (plist-get plist :match)) - (hooks (plist-get plist :add-hooks)) - (load-form (plist-get plist :on-load)) - (enter-form (plist-get plist :on-enter)) - (exit-form (plist-get plist :on-exit)) - (init-var (intern (format "%s-init" name)))) + (declare (indent 1)) + (let ((init-var (intern (format "%s-init" name)))) `(progn - ,(if load-form `(defvar ,init-var nil)) + ,(if on-load `(defvar ,init-var nil)) (define-minor-mode ,name - ,doc-string + "A project minor mode generated by `def-project-mode!'." :init-value nil :lighter "" :keymap (make-sparse-keymap) (if (not ,name) - ,exit-form + ,on-exit (run-hook-with-args 'doom-project-hook ',name ,name) - ,(when load-form + ,(when on-load `(unless ,init-var - ,load-form + ,on-load (setq ,init-var t))) - ,enter-form)) - ,(when hooks - `(setq ,(intern (format "%s-hook" name)) ',hooks)) + ,on-enter)) + ,(when add-hooks + `(setq ,(intern (format "%s-hook" name)) ',add-hooks)) ,(when (or modes match files when) `(associate! ,name :modes ,modes