From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Juri Linkov Newsgroups: gmane.emacs.bugs Subject: bug#69511: Restore any state after revert-buffer Date: Sat, 02 Mar 2024 19:55:50 +0200 Organization: LINKOV.NET Message-ID: <86y1b0r00p.fsf@mail.linkov.net> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="5877"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/30.0.50 (x86_64-pc-linux-gnu) To: 69511@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sat Mar 02 19:01:14 2024 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1rgTfe-0001Qy-Aa for geb-bug-gnu-emacs@m.gmane-mx.org; Sat, 02 Mar 2024 19:01:14 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rgTfO-0000lv-0E; Sat, 02 Mar 2024 13:00:58 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rgTf8-0000km-7p for bug-gnu-emacs@gnu.org; Sat, 02 Mar 2024 13:00:44 -0500 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1rgTez-0008SV-Gb for bug-gnu-emacs@gnu.org; Sat, 02 Mar 2024 13:00:41 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1rgTfR-0005hV-Pz for bug-gnu-emacs@gnu.org; Sat, 02 Mar 2024 13:01:01 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Juri Linkov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 02 Mar 2024 18:01:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 69511 X-GNU-PR-Package: emacs X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.170940242021830 (code B ref -1); Sat, 02 Mar 2024 18:01:01 +0000 Original-Received: (at submit) by debbugs.gnu.org; 2 Mar 2024 18:00:20 +0000 Original-Received: from localhost ([127.0.0.1]:39339 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rgTel-0005g0-PY for submit@debbugs.gnu.org; Sat, 02 Mar 2024 13:00:20 -0500 Original-Received: from lists.gnu.org ([209.51.188.17]:34164) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rgTeh-0005fp-Kv for submit@debbugs.gnu.org; Sat, 02 Mar 2024 13:00:18 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rgTeE-0000Au-RF for bug-gnu-emacs@gnu.org; Sat, 02 Mar 2024 12:59:46 -0500 Original-Received: from relay9-d.mail.gandi.net ([217.70.183.199]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rgTeC-00087V-Jk for bug-gnu-emacs@gnu.org; Sat, 02 Mar 2024 12:59:46 -0500 Original-Received: by mail.gandi.net (Postfix) with ESMTPSA id 1CB20FF802 for ; Sat, 2 Mar 2024 17:59:40 +0000 (UTC) X-GND-Sasl: juri@linkov.net Received-SPF: pass client-ip=217.70.183.199; envelope-from=juri@linkov.net; helo=relay9-d.mail.gandi.net X-Spam_score_int: -25 X-Spam_score: -2.6 X-Spam_bar: -- X-Spam_report: (-2.6 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:280906 Archived-At: --=-=-= Content-Type: text/plain 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: --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=revert-buffer-state-functions.patch 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'. --=-=-= Content-Type: text/plain 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: --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=outline-minor-mode-highlight-buffer.patch 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" --=-=-=--