diff options
| author | Lars Ingebrigtsen | 2022-01-27 22:26:12 +0100 |
|---|---|---|
| committer | Lars Ingebrigtsen | 2022-01-27 22:26:12 +0100 |
| commit | ce220524fcfcd0b51cb13cd2c15470f1b6ea0baf (patch) | |
| tree | e1bfaa1e7ef64a70b270168669dfcf0f11b8801f | |
| parent | b8ddd94aacb4478600d528e0080aff334e44e0f6 (diff) | |
| download | emacs-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.el | 107 |
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. | ||
| 5821 | See `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. |
| 5821 | You can answer \\`y' or \\`SPC' to save, \\`n' or \\`DEL' not to save, \\`C-r' | 5842 | You 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) |