all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Michal Nazarewicz <mina86@mina86.com>
To: Stefan Monnier <monnier@IRO.UMontreal.CA>,
	Drew Adams <drew.adams@oracle.com>
Cc: emacs-devel@gnu.org
Subject: [PATCHv2] files.el: avoid asking whether to kill Emacs multiple times
Date: Fri, 30 Jan 2015 02:39:17 +0100	[thread overview]
Message-ID: <xa1t386t6o8q.fsf@mina86.com> (raw)
In-Reply-To: <jwvpp9xegd3.fsf-monnier+emacs@gnu.org>

* lisp/files.el (save-buffers-kill-emacs): If `confirm-kill-emacs' is
set, but user has just been asked whether they really want to kill Emacs
(for example with a ‘Modified buffers exist; exit anyway?’ prompt) , do
not ask them for another confirmation.
---
 lisp/files.el | 63 ++++++++++++++++++++++++++++++++---------------------------
 1 file changed, 34 insertions(+), 29 deletions(-)

On Thu, Jan 29 2015, Stefan Monnier <monnier@IRO.UMontreal.CA> wrote:
>>> If `confirm-kill-emacs' is set, but user has just been asked whether
>>> they really want to kill Emacs (for example with a ‘Modified buffers
>>> exist; exit anyway?’ prompt), do not ask them for another confirmation.
>
> I agree that skipping the second confirmation would be desirable.
>
>>> However, apply this exception only if `confirm-kill-emacs' is
>>> 'yes-or-no-p or 'y-or-n-p, otherwise this change might errenously
>>> prevent some user defined function from being run.

> Is it really worth the trouble?  Comparing functions is just a bad
> idea in general, so if we can avoid it, it's preferable.

I’m happy to remove that comparison.  I just wanted to avoid situations
where we break things for someone doing something weird like:

  (setq confirm-kill-emacs
        (lambda (_) …something that really should be 
                     a kill-emacs-query-functions…))

Not having this special case makes code easier though so I can live with
a conclusion that breaking such code is worth it.

diff --git a/lisp/files.el b/lisp/files.el
index 40a4289..5e80cb7 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -6590,35 +6590,40 @@ (defun save-buffers-kill-emacs (&optional arg)
 if any returns nil.  If `confirm-kill-emacs' is non-nil, calls it."
   (interactive "P")
   (save-some-buffers arg t)
-  (and (or (not (memq t (mapcar (function
-				  (lambda (buf) (and (buffer-file-name buf)
-						     (buffer-modified-p buf))))
-				(buffer-list))))
-	   (yes-or-no-p "Modified buffers exist; exit anyway? "))
-       (or (not (fboundp 'process-list))
-	   ;; process-list is not defined on MSDOS.
-	   (let ((processes (process-list))
-		 active)
-	     (while processes
-	       (and (memq (process-status (car processes)) '(run stop open listen))
-		    (process-query-on-exit-flag (car processes))
-		    (setq active t))
-	       (setq processes (cdr processes)))
-	     (or (not active)
-		 (with-current-buffer-window
-		  (get-buffer-create "*Process List*") nil
-		  #'(lambda (window _value)
-		      (with-selected-window window
-			(unwind-protect
-			    (yes-or-no-p "Active processes exist; kill them and exit anyway? ")
-			  (when (window-live-p window)
-			    (quit-restore-window window 'kill)))))
-		  (list-processes t)))))
-       ;; Query the user for other things, perhaps.
-       (run-hook-with-args-until-failure 'kill-emacs-query-functions)
-       (or (null confirm-kill-emacs)
-	   (funcall confirm-kill-emacs "Really exit Emacs? "))
-       (kill-emacs)))
+  (let ((confirm confirm-kill-emacs))
+    (and
+     (or (not (memq t (mapcar (function
+                               (lambda (buf) (and (buffer-file-name buf)
+                                                  (buffer-modified-p buf))))
+                              (buffer-list))))
+         (progn (setq confirm nil)
+                (yes-or-no-p "Modified buffers exist; exit anyway? ")))
+     (or (not (fboundp 'process-list))
+         ;; process-list is not defined on MSDOS.
+         (let ((processes (process-list))
+               active)
+           (while processes
+             (and (memq (process-status (car processes)) '(run stop open listen))
+                  (process-query-on-exit-flag (car processes))
+                  (setq active t))
+             (setq processes (cdr processes)))
+           (or (not active)
+               (with-current-buffer-window
+                (get-buffer-create "*Process List*") nil
+                #'(lambda (window _value)
+                    (with-selected-window window
+                      (unwind-protect
+                          (progn
+                            (setq confirm nil)
+                            (yes-or-no-p "Active processes exist; kill them and exit anyway? "))
+                        (when (window-live-p window)
+                          (quit-restore-window window 'kill)))))
+                (list-processes t)))))
+     ;; Query the user for other things, perhaps.
+     (run-hook-with-args-until-failure 'kill-emacs-query-functions)
+     (or (null confirm)
+         (funcall confirm "Really exit Emacs? "))
+     (kill-emacs))))
 
 (defun save-buffers-kill-terminal (&optional arg)
   "Offer to save each buffer, then kill the current connection.
-- 
2.2.0.rc0.207.ga3a616c



  parent reply	other threads:[~2015-01-30  1:39 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-29 14:06 [PATCH] files.el: avoid asking whether to kill Emacs multiple times Michal Nazarewicz
2015-01-29 14:35 ` Drew Adams
2015-01-29 15:54   ` Stefan Monnier
2015-01-29 16:01     ` David Kastrup
2015-01-30  1:39     ` Michal Nazarewicz [this message]
2015-01-30  6:11       ` [PATCHv2] " Stefan Monnier
2015-01-30 10:43         ` Michal Nazarewicz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xa1t386t6o8q.fsf@mina86.com \
    --to=mina86@mina86.com \
    --cc=drew.adams@oracle.com \
    --cc=emacs-devel@gnu.org \
    --cc=monnier@IRO.UMontreal.CA \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.