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