From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Eli Zaretskii Newsgroups: gmane.emacs.bugs Subject: bug#69511: Restore any state after revert-buffer Date: Sun, 03 Mar 2024 19:43:17 +0200 Message-ID: <864jdnnrd6.fsf@gnu.org> References: <86y1b0r00p.fsf@mail.linkov.net> <867cikpkpm.fsf@gnu.org> <864jdnpw83.fsf@mail.linkov.net> <86jzmjofdv.fsf@gnu.org> <86il23kywt.fsf@mail.linkov.net> Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="35535"; mail-complaints-to="usenet@ciao.gmane.io" Cc: 69511@debbugs.gnu.org To: Juri Linkov Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sun Mar 03 18:44:42 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 1rgptB-00095n-Rc for geb-bug-gnu-emacs@m.gmane-mx.org; Sun, 03 Mar 2024 18:44:41 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rgpt4-00022y-B4; Sun, 03 Mar 2024 12:44:34 -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 1rgpt3-00022l-JM for bug-gnu-emacs@gnu.org; Sun, 03 Mar 2024 12:44:33 -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 1rgpt3-0005G2-B4 for bug-gnu-emacs@gnu.org; Sun, 03 Mar 2024 12:44:33 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1rgptW-0001vC-DX for bug-gnu-emacs@gnu.org; Sun, 03 Mar 2024 12:45:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Eli Zaretskii Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 03 Mar 2024 17:45:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 69511 X-GNU-PR-Package: emacs Original-Received: via spool by 69511-submit@debbugs.gnu.org id=B69511.17094878477303 (code B ref 69511); Sun, 03 Mar 2024 17:45:02 +0000 Original-Received: (at 69511) by debbugs.gnu.org; 3 Mar 2024 17:44:07 +0000 Original-Received: from localhost ([127.0.0.1]:41261 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rgpsc-0001tj-PH for submit@debbugs.gnu.org; Sun, 03 Mar 2024 12:44:07 -0500 Original-Received: from eggs.gnu.org ([209.51.188.92]:38800) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rgpsT-0001sy-4l for 69511@debbugs.gnu.org; Sun, 03 Mar 2024 12:44:05 -0500 Original-Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rgprt-0004tE-OM; Sun, 03 Mar 2024 12:43:21 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=IFzNpDCATmKcCp/upgA5mHyTDvFQNptsjYGlwU7I4J4=; b=fMKqtsa9GQ2i bKP9BLuuLAYbnjZ3A4xYt4YBp2GEfirKe1z9yE84sfy2J1zLYtFaPi4RJTPRXFEa+WIbmasb9JT/B juBZ7mbqZrofznYnEzWakl+a6FMpVNdCPQb5+S/4CPPDVbEgjfNJDyPbyP5gkLx0NibnPWW+i2rvP hkF5vlVc6SaxNaMTiHedQfH8R66sj9V0dLFOaOlsOQI9z1SUqSLGHQOrqXu7AB1CZbplSexKJpsM5 d0nOInzeSp+60xGfo433SHtU/9jLCqLPhLFsQUgo+7Bzw28bqvyJt+hTgprh8Cgof3h0shuMDVJbc qgIl5xGfW+j9KDa+1qi2NA==; In-Reply-To: <86il23kywt.fsf@mail.linkov.net> (message from Juri Linkov on Sun, 03 Mar 2024 19:28:34 +0200) 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:280960 Archived-At: > From: Juri Linkov > Cc: 69511@debbugs.gnu.org > Date: Sun, 03 Mar 2024 19:28:34 +0200 > > > Apart of the "state" thing, which I think is sub-optimal for the > > reasons explained above, this is fine, thanks. > > Like Michael suggested a set of functions should be created. > These functions should share the same prefix. > > Then revert-buffer-state-read-only will looks like this: > > diff --git a/lisp/files.el b/lisp/files.el > index 3460c327bb4..82ad748d192 100644 > --- a/lisp/files.el > +++ b/lisp/files.el > @@ -6805,6 +6805,24 @@ revert-buffer-internal-hook > ;; `preserve-modes' argument of `revert-buffer'. > (defvar revert-buffer-preserve-modes) > > +(defvar revert-buffer-state-functions '(revert-buffer-state-read-only) > + "Functions to save and restore any state during `revert-buffer'. > +The value of this variable is a list of functions that are called before > +reverting the buffer. Each of these functions are called without > +arguments and should return a lambda that can restore a previous state > +of the buffer. Then after reverting the buffer each of these lambdas > +will be called one by one in the order of the list to restore previous > +states of the buffer. An example of the buffer state is keeping the > +buffer read-only, or keeping minor modes, etc.") > + > +(defun revert-buffer-state-read-only () > + "Save and restore read-only state for `revert-buffer'." > + (when-let ((state (and (boundp 'read-only-mode--state) > + (list read-only-mode--state)))) > + (lambda () > + (setq buffer-read-only (car state)) > + (setq-local read-only-mode--state (car state))))) > + > (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,14 +6872,12 @@ revert-buffer > (interactive (list (not current-prefix-arg))) > (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)))) > + (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)))))) > + (mapc #'funcall state-functions)))) > > (defun revert-buffer--default (ignore-auto noconfirm) > "Default function for `revert-buffer'. > > So the whole set of functions will be: > > revert-buffer-state-functions > revert-buffer-state-read-only > revert-buffer-state-outlines > ... > > Or like the variable 'preserve-modes' hints above, > the common prefix could be like this: > > revert-buffer-preserve-functions > revert-buffer-preserve-modes > revert-buffer-preserve-read-only > revert-buffer-preserve-outlines > ... > > Which prefix would you prefer? How about revert-buffer-restore- ?