From 4b2e57e396314e63d70558e0aa5ad32c1cf87532 Mon Sep 17 00:00:00 2001 From: Case Duckworth Date: Fri, 14 Jan 2022 17:20:23 -0600 Subject: David Bowie --- lisp/elephant.el | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 lisp/elephant.el (limited to 'lisp/elephant.el') diff --git a/lisp/elephant.el b/lisp/elephant.el new file mode 100644 index 0000000..3cae17a --- /dev/null +++ b/lisp/elephant.el @@ -0,0 +1,58 @@ +;;; elephant.el --- Remember variables and modes -*- lexical-binding: t; -*- + +;;; Code: + +(defmacro elephant-remember (alist) + "Setup a closure remembering symbols to apply with +`remember-reset'. The variables will be renamed using TEMPLATE. +ALIST contains cells of the form (SYMBOL . NEW-VALUE), where +SYMBOL is a variable or mode name, and its value is what to set +after `remember-set'." + (unless lexical-binding + (user-error "`elephant' requires lexical binding.")) + + (let* ((template (format "elephant--%s-%%s" (gensym))) + (reset-fn (intern (format template "reset")))) + (cl-destructuring-bind (let-list fn-set-list fn-reset-list) + (cl-loop + for (sym . val) in (if (symbolp alist) (symbol-value alist) alist) + as rem = (intern (format template sym)) + + collect (list rem sym) + into let-list + + collect (cond ((eq val 'enable) + `(,sym +1)) + ((eq val 'disable) + `(,sym -1)) + (t `(setq-local ,sym ,val))) + into fn-set-list + + collect (cond ((memq val '(enable disable)) + `(progn (,sym (if ,rem +1 -1)) + (fmakunbound ',rem))) + (t `(progn (setq-local ,sym ,rem) + (makunbound ',rem)))) + into fn-reset-list + + finally return (list let-list + fn-set-list + fn-reset-list)) + `(progn + (defvar-local ,reset-fn nil + "Function to recall values from `elephant-remember'.") + (let ,let-list + (setf (symbol-function ',reset-fn) + (lambda () + ,@fn-reset-list + (redraw-display) + (fmakunbound ',reset-fn)))) + ,@fn-set-list + ',reset-fn)))) + +(defun elephant-forget () + "Forget all symbols generated by `elephant-remember'." + ) + +(provide 'elephant) +;;; elephant.el ends here -- cgit 1.4.1-21-gabe81