core-lib: add unsetq-hook! #1568

This commit is contained in:
Henrik Lissner 2019-07-21 14:35:45 +02:00
parent 987061aedd
commit f05aa3a0b1
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395

View file

@ -76,6 +76,26 @@ list is returned as-is."
collect (cadr hook) collect (cadr hook)
else collect (intern (format "%s-hook" (symbol-name hook))))))) else collect (intern (format "%s-hook" (symbol-name hook)))))))
(defun doom--setq-hook-fns (hooks rest &optional singles)
(unless (or singles (= 0 (% (length rest) 2)))
(signal 'wrong-number-of-arguments (list #'evenp (length rest))))
(cl-loop with vars = (let ((args rest)
vars)
(while args
(push (if singles
(list (pop args))
(cons (pop args) (pop args)))
vars))
(nreverse vars))
for hook in (doom--resolve-hook-forms hooks)
for mode = (string-remove-suffix "-hook" (symbol-name hook))
append
(cl-loop for (var . val) in vars
collect
(list var val hook
(intern (format "doom--setq-%s-for-%s-h"
var mode))))))
;; ;;
;;; Public library ;;; Public library
@ -267,36 +287,31 @@ If N and M = 1, there's no benefit to using this macro over `remove-hook'.
(declare (indent defun) (debug t)) (declare (indent defun) (debug t))
`(add-hook! :remove ,@args)) `(add-hook! :remove ,@args))
(defmacro setq-hook! (hooks &rest rest) (defmacro setq-hook! (hooks &rest var-vals)
"Sets buffer-local variables on HOOKS. "Sets buffer-local variables on HOOKS.
(setq-hook! 'markdown-mode-hook (setq-hook! 'markdown-mode-hook
line-spacing 2 line-spacing 2
fill-column 80) fill-column 80)
\(fn HOOKS &rest SYM VAL...)" \(fn HOOKS &rest [SYM VAL]...)"
(declare (indent 1)) (declare (indent 1))
(unless (= 0 (% (length rest) 2)) (macroexp-progn
(signal 'wrong-number-of-arguments (list #'evenp (length rest)))) (cl-loop for (var val hook fn) in (doom--setq-hook-fns hooks var-vals)
(let ((vars (let ((args rest) collect `(defun ,fn (&rest _)
vars) ,(format "%s = %s" var (pp-to-string val))
(while args (setq-local ,var ,val))
(push (symbol-name (car args)) vars) collect `(remove-hook ',hook #',fn) ; ensure set order
(setq args (cddr args))) collect `(add-hook ',hook #',fn 'append))))
(string-join (sort vars #'string-lessp) "-"))))
(macroexp-progn (defmacro unsetq-hook! (hooks &rest vars)
(cl-loop for hook in (doom--resolve-hook-forms hooks) "Unbind setq hooks on HOOKS for VARS.
for mode = (string-remove-suffix "-hook" (symbol-name hook))
for fn = (intern (format "doom--setq-%s-for-%s-h" vars mode)) \(fn HOOKS &rest [SYM VAL]...)"
collect `(fset ',fn (declare (indent 1))
(lambda (&rest _) (macroexp-progn
,@(let (forms) (cl-loop for (_var _val hook fn) in (doom--setq-hook-fns hooks vars 'singles)
(while rest collect `(remove-hook ',hook #',fn))))
(let ((var (pop rest))
(val (pop rest)))
(push `(setq-local ,var ,val) forms)))
(nreverse forms))))
collect `(add-hook ',hook #',fn 'append)))))
(defmacro def-advice! (symbol arglist docstring where places &rest body) (defmacro def-advice! (symbol arglist docstring where places &rest body)
"Define an advice called NAME and add it to PLACES. "Define an advice called NAME and add it to PLACES.