[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#69511: Restore any state after revert-buffer
From: |
Juri Linkov |
Subject: |
bug#69511: Restore any state after revert-buffer |
Date: |
Sat, 02 Mar 2024 19:55:50 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/30.0.50 (x86_64-pc-linux-gnu) |
This patch adds a new variable 'revert-buffer-state-functions'
that will allow any state to be saved and restored,
not only the currently hard-coded 'read-only' state:
diff --git a/lisp/files.el b/lisp/files.el
index ed18bc5841e..e8ecb351759 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -6804,6 +6805,13 @@ revert-buffer-internal-hook
;; `preserve-modes' argument of `revert-buffer'.
(defvar revert-buffer-preserve-modes)
+(defvar-local revert-buffer-state-functions nil
+ "Functions to save and restore any state during `revert-buffer'.
+This variable is a list of functions that are called before
+reverting the buffer. These functions should return a lambda
+that will be called after reverting the buffer
+to restore a previous state saved in that lambda.")
+
(defun revert-buffer (&optional ignore-auto noconfirm preserve-modes)
"Replace current buffer text with the text of the visited file on disk.
This undoes all changes since the file was visited or saved.
@@ -6854,13 +6862,16 @@ revert-buffer
(let ((revert-buffer-in-progress-p t)
(revert-buffer-preserve-modes preserve-modes)
(state (and (boundp 'read-only-mode--state)
- (list read-only-mode--state))))
+ (list read-only-mode--state)))
+ (state-functions
+ (delq nil (mapcar #'funcall revert-buffer-state-functions))))
;; Return whatever 'revert-buffer-function' returns.
(prog1 (funcall (or revert-buffer-function #'revert-buffer--default)
ignore-auto noconfirm)
(when state
(setq buffer-read-only (car state))
- (setq-local read-only-mode--state (car state))))))
+ (setq-local read-only-mode--state (car state)))
+ (mapc #'funcall state-functions))))
(defun revert-buffer--default (ignore-auto noconfirm)
"Default function for `revert-buffer'.
One of numerous examples is to save and restore
hidden outlines after doing 'revert-buffer':
(add-hook 'Buffer-menu-mode-hook
(lambda ()
(add-hook 'revert-buffer-state-functions
(lambda ()
(let ((regexp (outline-hidden-headings-regexp)))
(when regexp
(lambda ()
(outline-hide-by-heading-regexp regexp))))))))
Currently this handles outlines only in the buffer list.
But probably this settings should be added to outline-minor-mode.
And here is the immediate need to use it to rehighlight the outlines
after reverting the buffer list:
diff --git a/lisp/buff-menu.el b/lisp/buff-menu.el
index ec5337e3fda..ae3f3e0035e 100644
--- a/lisp/buff-menu.el
+++ b/lisp/buff-menu.el
@@ -274,7 +276,12 @@ Buffer-menu-mode
:interactive nil
(setq-local buffer-stale-function
(lambda (&optional _noconfirm) 'fast))
- (add-hook 'tabulated-list-revert-hook 'list-buffers--refresh nil t))
+ (add-hook 'tabulated-list-revert-hook 'list-buffers--refresh nil t)
+ (add-hook 'revert-buffer-state-functions
+ (lambda ()
+ (when (bound-and-true-p outline-minor-mode)
+ (lambda ()
+ (outline-minor-mode-highlight-buffer))))))
(defun buffer-menu--display-help ()
(message "%s"
- bug#69511: Restore any state after revert-buffer,
Juri Linkov <=
- bug#69511: Restore any state after revert-buffer, Eli Zaretskii, 2024/03/02
- bug#69511: Restore any state after revert-buffer, Juri Linkov, 2024/03/03
- bug#69511: Restore any state after revert-buffer, Eli Zaretskii, 2024/03/03
- bug#69511: Restore any state after revert-buffer, Juri Linkov, 2024/03/03
- bug#69511: Restore any state after revert-buffer, Eli Zaretskii, 2024/03/03
- bug#69511: Restore any state after revert-buffer, Juri Linkov, 2024/03/03
- bug#69511: Restore any state after revert-buffer, Eli Zaretskii, 2024/03/03
bug#69511: Restore any state after revert-buffer, Michael Heerdegen, 2024/03/02