emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 1cfb89dc79: Allow extending 'save-some-buffers'


From: Lars Ingebrigtsen
Subject: master 1cfb89dc79: Allow extending 'save-some-buffers'
Date: Mon, 23 May 2022 03:45:58 -0400 (EDT)

branch: master
commit 1cfb89dc79b76923c1c93cb44e3e4836b6a8c2bf
Author: Lars Ingebrigtsen <larsi@gnus.org>
Commit: Lars Ingebrigtsen <larsi@gnus.org>

    Allow extending 'save-some-buffers'
    
    * lisp/abbrev.el (abbrev--possibly-save): Separated out from
    `save-some-buffers'.
    (save-some-buffers-functions): Add to the save function.
    
    * lisp/files.el (save-some-buffers-functions): New variable.
    (save-some-buffers): Use it.
    (save-buffers-kill-emacs): Also use it to see if we have something
    to save (bug#55579).
---
 etc/NEWS       |  6 ++++++
 lisp/abbrev.el | 22 ++++++++++++++++++++++
 lisp/files.el  | 43 ++++++++++++++++++++++++++-----------------
 3 files changed, 54 insertions(+), 17 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index 80e867135e..c146b746cf 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1859,6 +1859,12 @@ functions.
 
 * Lisp Changes in Emacs 29.1
 
+** 'save-some-buffers' can now be extended to save other things.
+Traditionally, 'save-some-buffers' saved buffers, and also saved
+abbrevs.  This has been generalized via the
+'save-some-buffers-functions', and packages can now register things to
+be saved.
+
 ** Themes
 
 ---
diff --git a/lisp/abbrev.el b/lisp/abbrev.el
index 214f7435d9..3ee972869b 100644
--- a/lisp/abbrev.el
+++ b/lisp/abbrev.el
@@ -1197,6 +1197,28 @@ This mode is for editing abbrevs in a buffer prepared by 
`edit-abbrevs',
 which see."
   :interactive nil)
 
+(defun abbrev--possibly-save (query &optional arg)
+  ;; Query mode.
+  (if (eq query 'query)
+      (and save-abbrevs abbrevs-changed)
+    ;; Maybe save abbrevs, and record whether we either saved them or
+    ;; asked to.
+    (and save-abbrevs
+         abbrevs-changed
+         (progn
+          (if (or arg
+                  (eq save-abbrevs 'silently)
+                  (y-or-n-p (format "Save abbrevs in %s? " abbrev-file-name)))
+              (progn
+                 (write-abbrev-file nil)
+                 nil)
+            ;; Don't keep bothering user if they say no.
+            (setq abbrevs-changed nil)
+             ;; Inhibit message in `save-some-buffers'.
+            t)))))
+
+(add-hook 'save-some-buffers-functions #'abbrev--possibly-save)
+
 (provide 'abbrev)
 
 ;;; abbrev.el ends here
diff --git a/lisp/files.el b/lisp/files.el
index 2b0dc54db8..2aef4d9230 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -5849,7 +5849,18 @@ See `save-some-buffers' for PRED values."
                                   (funcall pred))))
                        buffer))
                  (buffer-list))))
-         (delq nil buffers)))
+    (delq nil buffers)))
+
+(defvar save-some-buffers-functions nil
+  "Functions to be run by `save-some-buffers' after saving the buffers.
+The functions can be called in two \"modes\", depending on the
+first argument.  If the first argument is `query', then the
+function should return non-nil if there is something to be
+saved (but it should not actually save anything).
+
+If the first argument is something else, then the function should
+save according to the value of the second argument, which is the
+ARG argument from `save-some-buffers'.")
 
 (defun save-some-buffers (&optional arg pred)
   "Save some modified file-visiting buffers.  Asks user about each one.
@@ -5875,7 +5886,10 @@ should return non-nil if that buffer should be 
considered.
 PRED defaults to the value of `save-some-buffers-default-predicate'.
 
 See `save-some-buffers-action-alist' if you want to
-change the additional actions you can take on files."
+change the additional actions you can take on files.
+
+The functions in `save-some-buffers-functions' will be called
+after saving the buffers."
   (interactive "P")
   (unless pred
     (setq pred
@@ -5891,7 +5905,7 @@ change the additional actions you can take on files."
           (lambda (buffer)
             (setq switched-buffer buffer)))
          queried autosaved-buffers
-        files-done abbrevs-done)
+        files-done inhibit-message)
     (unwind-protect
         (save-window-excursion
           (dolist (buffer (buffer-list))
@@ -5939,19 +5953,10 @@ change the additional actions you can take on files."
                  (files--buffers-needing-to-be-saved pred)
                 '("buffer" "buffers" "save")
                 save-some-buffers-action-alist))
-          ;; Maybe to save abbrevs, and record whether
-          ;; we either saved them or asked to.
-          (and save-abbrevs abbrevs-changed
-              (progn
-                (if (or arg
-                        (eq save-abbrevs 'silently)
-                        (y-or-n-p (format "Save abbrevs in %s? "
-                                           abbrev-file-name)))
-                    (write-abbrev-file nil))
-                ;; Don't keep bothering user if he says no.
-                (setq abbrevs-changed nil)
-                (setq abbrevs-done t)))
-          (or queried (> files-done 0) abbrevs-done
+          ;; Allow other things to be saved at this time, like abbrevs.
+          (dolist (func save-some-buffers-functions)
+            (setq inhibit-message (or (funcall func nil arg) inhibit-message)))
+          (or queried (> files-done 0) inhibit-message
              (cond
               ((null autosaved-buffers)
                 (when (called-interactively-p 'any)
@@ -7779,7 +7784,11 @@ If RESTART, restart Emacs after killing the current 
Emacs process."
   (interactive "P")
   ;; Don't use save-some-buffers-default-predicate, because we want
   ;; to ask about all the buffers before killing Emacs.
-    (when (files--buffers-needing-to-be-saved t)
+  (when (or (files--buffers-needing-to-be-saved t)
+            (catch 'need-save
+              (dolist (func save-some-buffers-functions)
+                (when (funcall func 'query)
+                  (throw 'need-save t)))))
       (if (use-dialog-box-p)
           (pcase (x-popup-dialog
                   t `("Unsaved Buffers"



reply via email to

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