]> git.eshelyaron.com Git - emacs.git/commitdiff
Allow `kill-buffer' query to save the buffer first
authorLars Ingebrigtsen <larsi@gnus.org>
Fri, 24 Jun 2022 09:04:03 +0000 (11:04 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Fri, 24 Jun 2022 09:04:51 +0000 (11:04 +0200)
* lisp/loadup.el ("emacs-lisp/rmc"): Preload.

* lisp/simple.el (kill-buffer--possibly-save): New function to
offer to save the buffer before killing (bug#47075).

* src/buffer.c (Fkill_buffer): Call the new function to query the
user.
(syms_of_buffer): Define symbol.

lisp/loadup.el
lisp/simple.el
src/buffer.c

index 1d834da5b285094e9814346f0ba3bea268e02685..21a87dbd77bfbf6df14794fc56ff396863be9e4d 100644 (file)
       (message "Warning: Change in load-path due to site-load will be \
 lost after dumping")))
 
+;; Used by `kill-buffer', for instance.
+(load "emacs-lisp/rmc")
+
 ;; Make sure default-directory is unibyte when dumping.  This is
 ;; because we cannot decode and encode it correctly (since the locale
 ;; environment is not, and should not be, set up).  default-directory
index f2b3d82a7a598aa71862efda0dee0eaae98845a5..653cffae62ca5e979e8a18d75463f9b04d4b105f 100644 (file)
@@ -10560,6 +10560,23 @@ If the buffer doesn't exist, create it first."
   (interactive)
   (pop-to-buffer-same-window (get-scratch-buffer-create)))
 
+(defun kill-buffer--possibly-save (buffer)
+  (let ((response
+         (cadr
+          (read-multiple-choice
+           (format "Buffer %s modified; kill anyway?"
+                   (buffer-name))
+           '((?y "yes" "kill buffer without saving")
+             (?n "no" "exit without doing anything")
+             (?s "save and then kill" "save the buffer and then kill it"))
+           nil nil (not use-short-answers)))))
+    (if (equal response "no")
+        nil
+      (unless (equal response "yes")
+        (with-current-buffer buffer
+          (save-buffer)))
+      t)))
+
 \f
 
 (provide 'simple)
index 7adcd22d88bab41d9dfb139d0ac2b31de10634bc..509ce51b55ea34e14d28156956235ba61f2cd448 100644 (file)
@@ -1809,10 +1809,12 @@ cleaning up all windows currently displaying the buffer to be killed. */)
     /* Query if the buffer is still modified.  */
     if (INTERACTIVE && modified)
       {
-       AUTO_STRING (format, "Buffer %s modified; kill anyway? ");
-       tem = do_yes_or_no_p (CALLN (Fformat, format, BVAR (b, name)));
-       if (NILP (tem))
+       /* Ask whether to kill the buffer, and exit if the user says
+          "no".  */
+       if (NILP (call1 (Qkill_buffer__possibly_save, buffer)))
          return unbind_to (count, Qnil);
+       /* Recheck modified.  */
+       modified = BUF_MODIFF (b) > BUF_SAVE_MODIFF (b);
       }
 
     /* Delete the autosave file, if requested. */
@@ -6474,5 +6476,7 @@ will run for `clone-indirect-buffer' calls as well.  */);
 
   DEFSYM (Qautosaved, "autosaved");
 
+  DEFSYM (Qkill_buffer__possibly_save, "kill-buffer--possibly-save");
+
   Fput (intern_c_string ("erase-buffer"), Qdisabled, Qt);
 }