Refactor def-project-mode! with cl-defmacro

This commit is contained in:
Henrik Lissner 2018-06-16 11:34:19 +02:00
parent 02d532a09a
commit 5501b949ef
No known key found for this signature in database
GPG Key ID: 5F6C0EA160557395

View File

@ -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