about summary refs log tree commit diff stats
path: root/lisp/remember.el
blob: 39476d153a6f1c8662c57244a45650e10c86eb57 (plain)
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)