diff options
author | Lars Ingebrigtsen <larsi@gnus.org> | 2022-05-06 13:10:45 +0200 |
---|---|---|
committer | Lars Ingebrigtsen <larsi@gnus.org> | 2022-05-06 13:10:45 +0200 |
commit | b13356487fc3eaf82bfe51bee24ddf70c27c5834 (patch) | |
tree | 4e3f91a3b0bfc416a40d6366365fdff8d232b65f /lisp/emacs-lisp/easy-mmode.el | |
parent | 0bda1803bb83de41d4f1d55ee3e2437f2177c076 (diff) | |
download | emacs-b13356487fc3eaf82bfe51bee24ddf70c27c5834.tar.gz emacs-b13356487fc3eaf82bfe51bee24ddf70c27c5834.tar.bz2 emacs-b13356487fc3eaf82bfe51bee24ddf70c27c5834.zip |
Add new helper macros for minor modes to restore variables
* doc/lispref/modes.texi (Defining Minor Modes): Document it.
* lisp/emacs-lisp/easy-mmode.el (buffer-local-set-state): New macro.
(buffer-local-set-state--get): Helper function.
(buffer-local-restore-state): New function.
* lisp/textmodes/word-wrap-mode.el (word-wrap-whitespace-mode):
Use it to simplify code.
Diffstat (limited to 'lisp/emacs-lisp/easy-mmode.el')
-rw-r--r-- | lisp/emacs-lisp/easy-mmode.el | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/lisp/emacs-lisp/easy-mmode.el b/lisp/emacs-lisp/easy-mmode.el index 8a76eaf58cf..33c0472ea87 100644 --- a/lisp/emacs-lisp/easy-mmode.el +++ b/lisp/emacs-lisp/easy-mmode.el @@ -825,6 +825,39 @@ Interactively, COUNT is the prefix numeric argument, and defaults to 1." ,@body)) (put ',prev-sym 'definition-name ',base)))) + +(defmacro buffer-local-set-state (&rest pairs) + "Like `setq-local', but return an object that allows restoring previous state. +Use `buffer-local-restore-state' on the returned object to +restore the state. + +\(fn [VARIABLE VALUE]...)" + (declare (debug setq)) + (unless (zerop (mod (length pairs) 2)) + (error "PAIRS must have an even number of variable/value members")) + `(prog1 + (buffer-local-set-state--get ',pairs) + (setq-local ,@pairs))) + +(defun buffer-local-set-state--get (pairs) + (let ((states nil)) + (while pairs + (push (list (car pairs) + (and (boundp (car pairs)) + (local-variable-p (car pairs))) + (and (boundp (car pairs)) + (symbol-value (car pairs)))) + states) + (setq pairs (cddr pairs))) + (nreverse states))) + +(defun buffer-local-restore-state (states) + "Restore buffer local variable values in STATES. +STATES is an object returned by `buffer-local-set-state'." + (pcase-dolist (`(,variable ,local ,value) states) + (if local + (set variable value) + (kill-local-variable variable)))) (provide 'easy-mmode) |