From 9c15bb82f9ff3d4219e4c82c450a385d13d9035f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jul 2019 22:10:22 +0200 Subject: [PATCH] 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). --- core/core-lib.el | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 5d5506849..4baa0bca6 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -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) - 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) "-"))))) + (let ((vars (let ((args rest) + vars) + (while args + (push (symbol-name (car args)) vars) + (setq args (cddr args))) + (string-join (sort vars #'string-lessp) "-")))) (macroexp-progn - (append `((fset ',fnsym - (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)))))) + (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 `(setq-local ,var ,val) forms))) + (nreverse forms)))) + collect `(add-hook ',hook #',fn 'append))))) (defun advice-add! (symbols where functions) "Variadic version of `advice-add'.