1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2025-02-07 20:54:32 +00:00

Allow `kill-buffer' query to save the buffer first

* 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.
This commit is contained in:
Lars Ingebrigtsen 2022-06-24 11:04:03 +02:00
parent f2b7525e38
commit e193ea3c34
3 changed files with 27 additions and 3 deletions

View File

@ -397,6 +397,9 @@
(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

View 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)))
(provide 'simple)

View 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);
}