1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
;; ABANDON ALL HOPE YE WHO ENTER HERE
(defmacro remember-set (&rest symbols)
"Setup a closure remembering symbols to apply with
`remember-reset'. The variables will be renamed using TEMPLATE.
SYMBOLS is a plist: the properties are symbols or mode names, and
their values what to set after `remember-setup'."
(let* ((template (format "remember--%s-%%s" (gensym)))
(reset-fn (intern (format template "reset" "fn")))
(list (cl-loop for sym in symbols by #'cddr
collect `(,(intern (format template sym))
,sym)
into let-list
collect (let ((val (plist-get symbols sym)))
(cond ((eq val 'enable)
`(,sym +1))
((eq val 'disable)
`(,sym -1))
(t `(setq-local ,sym ,val))))
into fn-set-list
collect (let ((val (plist-get symbols sym))
(rem (intern (format template sym))))
(cond ((memq val '(enable disable))
`(,sym (if ,rem +1 -1)))
(t `(setq-local ,sym ,rem))))
into fn-reset-list
finally return (list let-list
fn-reset-list
fn-set-list))))
`(progn
(defvar-local ,reset-fn nil
"Function to recall values from `remember-set'.")
(let ,(cl-first list)
(setf (symbol-function ',reset-fn)
(lambda ()
,@(cl-second list))))
,@(cl-third list)
',reset-fn)))
;; test
(setq fn (remember-set display-fill-column-indicator-mode disable))
(funcall fn)
|