Optimize set-transient-hook!

In case HOOK-OR-FUNCTION is an expensive lisp form.
This commit is contained in:
Henrik Lissner 2019-05-04 18:55:24 -04:00
parent 1103db1679
commit 7f004f321a
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395

View file

@ -228,18 +228,18 @@ advised)."
(fn (if (symbolp (car forms)) (fn (if (symbolp (car forms))
(intern (format "doom|transient-hook-%s" (pop forms))) (intern (format "doom|transient-hook-%s" (pop forms)))
(make-symbol "doom|transient-hook-")))) (make-symbol "doom|transient-hook-"))))
`(progn `(let ((sym ,hook-or-function))
(fset ',fn (fset ',fn
(lambda (&rest _) (lambda (&rest _)
,@forms ,@forms
(cond ((functionp ,hook-or-function) (advice-remove ,hook-or-function #',fn)) (cond ((functionp sym) (advice-remove sym #',fn))
((symbolp ,hook-or-function) (remove-hook ,hook-or-function #',fn))) ((symbolp sym) (remove-hook sym #',fn)))
(unintern ',fn nil))) (unintern ',fn nil)))
(cond ((functionp ,hook-or-function) (cond ((functionp sym)
(advice-add ,hook-or-function ,(if append :after :before) #',fn)) (advice-add ,hook-or-function ,(if append :after :before) #',fn))
((symbolp ,hook-or-function) ((symbolp sym)
(put ',fn 'permanent-local-hook t) (put ',fn 'permanent-local-hook t)
(add-hook ,hook-or-function #',fn ,append)))))) (add-hook sym #',fn ,append))))))
(defmacro add-hook! (&rest args) (defmacro add-hook! (&rest args)
"A convenience macro for adding N functions to M hooks. "A convenience macro for adding N functions to M hooks.