57 lines
2.3 KiB
EmacsLisp
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)
|