summary refs log tree commit diff stats
path: root/lisp/remember.el
blob: a7594195bd2354a8417cf3d961697b1d169d185f (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
44
45
46
47
48
49
50
51
52
53
54
55
56
;;; remember.el --- Remember variables and modes -*- lexical-binding: t; -*-

;;; Code:

(defmacro remember-remember (alist)
  (let* ((template (format "remember--%s-%%s" (gensym)))
         (reset-fn (intern (format template "recall")))
         (things (cl-loop for (sym . newval) in alist
                          as rem = (intern (format template sym))

                          ;; Collect original values
                          
                          )))))


(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")))
         (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

(set 'fn (remember-set display-fill-column-indicator-mode disable))
(funcall fn)