Fix hook collisions by setq-hook!

Fixes an edge case where setq-hook! would override the setq hooks of
other calls to setq-hook!

I want to avoid make-symbol/gensym so users can refer to these hook
functions by name, in case users want to remove these hooks by hand, if
necessary (e.g. for debugging purposes).
This commit is contained in:
Henrik Lissner 2019-07-06 22:10:22 +02:00
parent 648e81f765
commit 9c15bb82f9
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395

View file

@ -334,24 +334,25 @@ If N and M = 1, there's no benefit to using this macro over `remove-hook'.
(declare (indent 1))
(unless (= 0 (% (length rest) 2))
(signal 'wrong-number-of-arguments (list #'evenp (length rest))))
(let* ((vars (let ((args rest)
(let ((vars (let ((args rest)
vars)
(while args
(push (symbol-name (car args)) vars)
(setq args (cddr args)))
vars))
(fnsym (intern (format "doom|setq-%s" (string-join (sort vars #'string-lessp) "-")))))
(string-join (sort vars #'string-lessp) "-"))))
(macroexp-progn
(append `((fset ',fnsym
(cl-loop for hook in (doom--resolve-hook-forms hooks)
for mode = (string-remove-suffix "-hook" (symbol-name hook))
for fn = (intern (format "doom|setq-%s-for-%s" vars mode))
collect `(fset ',fn
(lambda (&rest _)
,@(let (forms)
(while rest
(let ((var (pop rest))
(val (pop rest)))
(push `(set (make-local-variable ',var) ,val) forms)))
(nreverse forms)))))
(cl-loop for hook in (doom--resolve-hook-forms hooks)
collect `(add-hook ',hook #',fnsym 'append))))))
(push `(setq-local ,var ,val) forms)))
(nreverse forms))))
collect `(add-hook ',hook #',fn 'append)))))
(defun advice-add! (symbols where functions)
"Variadic version of `advice-add'.