aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Ingebrigtsen2022-01-27 22:26:12 +0100
committerLars Ingebrigtsen2022-01-27 22:26:12 +0100
commitce220524fcfcd0b51cb13cd2c15470f1b6ea0baf (patch)
treee1bfaa1e7ef64a70b270168669dfcf0f11b8801f
parentb8ddd94aacb4478600d528e0080aff334e44e0f6 (diff)
downloademacs-ce220524fcfcd0b51cb13cd2c15470f1b6ea0baf.tar.gz
emacs-ce220524fcfcd0b51cb13cd2c15470f1b6ea0baf.zip
Fix up previous "Quit Emacs" from menu logic
* lisp/files.el (files--buffers-needing-to-be-saved): Separated out into its own function... (save-some-buffers): ... from here. (save-buffers-kill-emacs): Check that we have anything to save before prompting the user.
-rw-r--r--lisp/files.el107
1 files changed, 58 insertions, 49 deletions
diff --git a/lisp/files.el b/lisp/files.el
index 9e8afc8d527..247579efb41 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -5816,6 +5816,27 @@ of the directory that was default during command invocation."
5816 (lambda () (file-in-directory-p default-directory root)))) 5816 (lambda () (file-in-directory-p default-directory root))))
5817(put 'save-some-buffers-root 'save-some-buffers-function t) 5817(put 'save-some-buffers-root 'save-some-buffers-function t)
5818 5818
5819(defun files--buffers-needing-to-be-saved (pred)
5820 "Return a list of buffers to save according to PRED.
5821See `save-some-buffers' for PRED values."
5822 (seq-filter
5823 (lambda (buffer)
5824 ;; Note that killing some buffers may kill others via
5825 ;; hooks (e.g. Rmail and its viewing buffer).
5826 (and (buffer-live-p buffer)
5827 (buffer-modified-p buffer)
5828 (not (buffer-base-buffer buffer))
5829 (or
5830 (buffer-file-name buffer)
5831 (with-current-buffer buffer
5832 (or (eq buffer-offer-save 'always)
5833 (and pred buffer-offer-save
5834 (> (buffer-size) 0)))))
5835 (or (not (functionp pred))
5836 (with-current-buffer buffer
5837 (funcall pred)))))
5838 (buffer-list)))
5839
5819(defun save-some-buffers (&optional arg pred) 5840(defun save-some-buffers (&optional arg pred)
5820 "Save some modified file-visiting buffers. Asks user about each one. 5841 "Save some modified file-visiting buffers. Asks user about each one.
5821You can answer \\`y' or \\`SPC' to save, \\`n' or \\`DEL' not to save, \\`C-r' 5842You can answer \\`y' or \\`SPC' to save, \\`n' or \\`DEL' not to save, \\`C-r'
@@ -5872,49 +5893,36 @@ change the additional actions you can take on files."
5872 (setq files-done 5893 (setq files-done
5873 (map-y-or-n-p 5894 (map-y-or-n-p
5874 (lambda (buffer) 5895 (lambda (buffer)
5875 ;; Note that killing some buffers may kill others via 5896 (if arg
5876 ;; hooks (e.g. Rmail and its viewing buffer). 5897 t
5877 (and (buffer-live-p buffer) 5898 (setq queried t)
5878 (buffer-modified-p buffer) 5899 (if (buffer-file-name buffer)
5879 (not (buffer-base-buffer buffer)) 5900 (if (or
5880 (or 5901 (equal (buffer-name buffer)
5881 (buffer-file-name buffer) 5902 (file-name-nondirectory
5882 (with-current-buffer buffer 5903 (buffer-file-name buffer)))
5883 (or (eq buffer-offer-save 'always) 5904 (string-match
5884 (and pred buffer-offer-save 5905 (concat "\\<"
5885 (> (buffer-size) 0))))) 5906 (regexp-quote
5886 (or (not (functionp pred)) 5907 (file-name-nondirectory
5887 (with-current-buffer buffer (funcall pred))) 5908 (buffer-file-name buffer)))
5888 (if arg 5909 "<[^>]*>\\'")
5889 t 5910 (buffer-name buffer)))
5890 (setq queried t) 5911 ;; The buffer name is similar to the file
5891 (if (buffer-file-name buffer) 5912 ;; name.
5892 (if (or 5913 (format "Save file %s? "
5893 (equal (buffer-name buffer) 5914 (buffer-file-name buffer))
5894 (file-name-nondirectory 5915 ;; The buffer and file names are dissimilar;
5895 (buffer-file-name buffer))) 5916 ;; display both.
5896 (string-match 5917 (format "Save file %s (buffer %s)? "
5897 (concat "\\<" 5918 (buffer-file-name buffer)
5898 (regexp-quote 5919 (buffer-name buffer)))
5899 (file-name-nondirectory 5920 ;; No file name.
5900 (buffer-file-name buffer))) 5921 (format "Save buffer %s? " (buffer-name buffer)))))
5901 "<[^>]*>\\'")
5902 (buffer-name buffer)))
5903 ;; The buffer name is similar to the
5904 ;; file name.
5905 (format "Save file %s? "
5906 (buffer-file-name buffer))
5907 ;; The buffer and file names are
5908 ;; dissimilar; display both.
5909 (format "Save file %s (buffer %s)? "
5910 (buffer-file-name buffer)
5911 (buffer-name buffer)))
5912 ;; No file name
5913 (format "Save buffer %s? " (buffer-name buffer))))))
5914 (lambda (buffer) 5922 (lambda (buffer)
5915 (with-current-buffer buffer 5923 (with-current-buffer buffer
5916 (save-buffer))) 5924 (save-buffer)))
5917 (buffer-list) 5925 (files--buffers-needing-to-be-saved pred)
5918 '("buffer" "buffers" "save") 5926 '("buffer" "buffers" "save")
5919 save-some-buffers-action-alist)) 5927 save-some-buffers-action-alist))
5920 ;; Maybe to save abbrevs, and record whether 5928 ;; Maybe to save abbrevs, and record whether
@@ -7752,15 +7760,16 @@ if any returns nil. If `confirm-kill-emacs' is non-nil, calls it."
7752 (interactive "P") 7760 (interactive "P")
7753 ;; Don't use save-some-buffers-default-predicate, because we want 7761 ;; Don't use save-some-buffers-default-predicate, because we want
7754 ;; to ask about all the buffers before killing Emacs. 7762 ;; to ask about all the buffers before killing Emacs.
7755 (if (use-dialog-box-p) 7763 (when (files--buffers-needing-to-be-saved t)
7756 (pcase (x-popup-dialog 7764 (if (use-dialog-box-p)
7757 t `("Unsaved Buffers" 7765 (pcase (x-popup-dialog
7758 ("Close Without Saving" . no-save) 7766 t `("Unsaved Buffers"
7759 ("Save All" . save-all) 7767 ("Close Without Saving" . no-save)
7760 ("Cancel" . cancel))) 7768 ("Save All" . save-all)
7761 ('cancel (user-error "Exit cancelled")) 7769 ("Cancel" . cancel)))
7762 ('save-all (save-some-buffers t))) 7770 ('cancel (user-error "Exit cancelled"))
7763 (save-some-buffers arg t)) 7771 ('save-all (save-some-buffers t)))
7772 (save-some-buffers arg t)))
7764 (let ((confirm confirm-kill-emacs)) 7773 (let ((confirm confirm-kill-emacs))
7765 (and 7774 (and
7766 (or (not (memq t (mapcar (lambda (buf) 7775 (or (not (memq t (mapcar (lambda (buf)