Add :local and :append capabilities to add-hook!
This commit is contained in:
parent
4356f894fd
commit
e2cb712b18
1 changed files with 38 additions and 27 deletions
|
@ -77,41 +77,52 @@ compilation."
|
||||||
(save-silently t))
|
(save-silently t))
|
||||||
,@forms)))
|
,@forms)))
|
||||||
|
|
||||||
(defmacro add-hook! (hook &rest func-or-forms)
|
(defmacro add-hook! (&rest args)
|
||||||
"A convenience macro for `add-hook'.
|
"A convenience macro for `add-hook'. Takes, in order:
|
||||||
|
|
||||||
HOOK can be one hook or a list of hooks. If the hook(s) are not quoted, -hook is
|
1. Optional properties :local and/or :append, which will make the hook
|
||||||
appended to them automatically. If they are quoted, they are used verbatim.
|
buffer-local or append to the list of hooks (respectively),
|
||||||
|
2. The hooks: either an unquoted major mode, an unquoted list of major-modes,
|
||||||
FUNC-OR-FORMS can be a quoted symbol, a list of quoted symbols, or forms. Forms
|
a quoted hook variable or a quoted list of hook variables. If unquoted, the
|
||||||
will be wrapped in a lambda. A list of symbols will expand into a series of
|
hooks will be resolved by appending -hook to each symbol.
|
||||||
add-hook calls.
|
3. A function, list of functions, or body forms to be wrapped in a lambda.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
(add-hook! 'some-mode-hook 'enable-something)
|
(add-hook! 'some-mode-hook 'enable-something)
|
||||||
(add-hook! some-mode '(enable-something and-another))
|
(add-hook! some-mode '(enable-something and-another))
|
||||||
(add-hook! '(one-mode-hook second-mode-hook) 'enable-something)
|
(add-hook! '(one-mode-hook second-mode-hook) 'enable-something)
|
||||||
(add-hook! (one-mode second-mode) 'enable-something)
|
(add-hook! (one-mode second-mode) 'enable-something)
|
||||||
(add-hook! (one-mode second-mode) (setq v 5) (setq a 2))"
|
(add-hook! :append (one-mode second-mode) 'enable-something)
|
||||||
|
(add-hook! :local (one-mode second-mode) 'enable-something)
|
||||||
|
(add-hook! (one-mode second-mode) (setq v 5) (setq a 2))
|
||||||
|
(add-hook! :append :local (one-mode second-mode) (setq v 5) (setq a 2))"
|
||||||
(declare (indent defun) (debug t))
|
(declare (indent defun) (debug t))
|
||||||
(unless func-or-forms
|
(let (hook append-p local-p)
|
||||||
(error "add-hook!: FUNC-OR-FORMS is empty"))
|
(while (keywordp (car args))
|
||||||
(let* ((val (car func-or-forms))
|
(cl-ecase (pop args)
|
||||||
(quoted-p (eq (car-safe hook) 'quote))
|
(:append (setq append-p t))
|
||||||
(hook (if quoted-p (cadr hook) hook))
|
(:local (setq local-p t))))
|
||||||
(funcs (if (eq (car-safe val) 'quote)
|
(let* ((hooks (pop args))
|
||||||
(if (cdr-safe (cadr val))
|
(quoted-p (eq (car-safe hooks) 'quote))
|
||||||
(cadr val)
|
(funcs
|
||||||
(list (cadr val)))
|
(let ((val (car args)))
|
||||||
(list func-or-forms)))
|
(if (eq (car-safe val) 'quote)
|
||||||
forms)
|
(if (cdr-safe (cadr val))
|
||||||
;; Maybe use `cl-loop'?
|
(cadr val)
|
||||||
(dolist (fn funcs)
|
(list (cadr val)))
|
||||||
(setq fn (if (symbolp fn) `(quote ,fn) `(lambda (&rest _) ,@func-or-forms)))
|
(list args))))
|
||||||
(dolist (h (if (listp hook) hook (list hook)))
|
forms)
|
||||||
(push `(add-hook ',(if quoted-p h (intern (format "%s-hook" h))) ,fn)
|
(when quoted-p
|
||||||
forms)))
|
(setq hooks (cadr hooks)))
|
||||||
`(progn ,@(reverse forms))))
|
(unless (listp hooks)
|
||||||
|
(setq hooks (list hooks)))
|
||||||
|
(dolist (fn funcs)
|
||||||
|
(setq fn (if (symbolp fn) `(quote ,fn) `(lambda (&rest args) ,@args)))
|
||||||
|
(dolist (h hooks)
|
||||||
|
(push `(add-hook ',(if quoted-p h (intern (format "%s-hook" h)))
|
||||||
|
,fn ,append-p ,local-p)
|
||||||
|
forms)))
|
||||||
|
`(progn ,@(reverse forms)))))
|
||||||
|
|
||||||
(defmacro associate! (mode &rest plist)
|
(defmacro associate! (mode &rest plist)
|
||||||
"Associate a major or minor mode to certain patterns and project files."
|
"Associate a major or minor mode to certain patterns and project files."
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue