bug-gnu-emacs
[Top][All Lists]
Advanced

[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"

reply via email to

[Prev in Thread] Current Thread [Next in Thread]