emacs/lisp/remember.el

57 lines
2.3 KiB
EmacsLisp

;;; 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)