From c72742869b79f71b6a2fcc68641c785b0194fa0b Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Tue, 27 Sep 2016 20:47:23 +0200 Subject: [PATCH] Make querying to kill processes customizable Introduce a new customization option, `confirm-kill-processes', that users can set to nil if they don't want Emacs to nag them about killing processes. * lisp/files.el (confirm-kill-processes): New customization option. (save-buffers-kill-emacs): Use customization option. * test/lisp/files-tests.el (files-test--save-buffers-kill-emacs--confirm-kill-processes): Add test for new customization option. * doc/emacs/entering.texi (Exiting): Document new user option. * doc/lispref/processes.texi (Query Before Exit): Document new user option. * etc/NEWS: Document new user option. --- doc/emacs/entering.texi | 5 +++++ doc/lispref/processes.texi | 7 +++++++ etc/NEWS | 7 +++++++ lisp/files.el | 14 +++++++++++++- test/lisp/files-tests.el | 23 +++++++++++++++++++++++ 5 files changed, 55 insertions(+), 1 deletion(-) diff --git a/doc/emacs/entering.texi b/doc/emacs/entering.texi index 66817e3..09331e8 100644 --- a/doc/emacs/entering.texi +++ b/doc/emacs/entering.texi @@ -133,6 +133,11 @@ Exiting @code{confirm-kill-emacs} is the function @code{yes-or-no-p}. The default value of @code{confirm-kill-emacs} is @code{nil}. address@hidden confirm-kill-processes + If the value of the variable @code{confirm-kill-processes} is address@hidden, @kbd{C-x C-c} does not ask for confirmation before killing +subprocesses started by Emacs. The value is @code{t} by default. + To further customize what happens when Emacs is exiting, see @ref{Killing Emacs,,, elisp, The GNU Emacs Lisp Reference Manual}. diff --git a/doc/lispref/processes.texi b/doc/lispref/processes.texi index f9d5096..87c0b5c 100644 --- a/doc/lispref/processes.texi +++ b/doc/lispref/processes.texi @@ -1970,6 +1970,13 @@ Query Before Exit @end smallexample @end defun address@hidden confirm-kill-processes +If this user option is set to @code{t} (the default), then Emacs asks +for confirmation before killing processes on exit. If it is address@hidden, Emacs kills processes without confirmation, i.e., the +query flag of all processes is ignored. address@hidden defopt + @node System Processes @section Accessing Other Processes @cindex system processes diff --git a/etc/NEWS b/etc/NEWS index c3f4cf0..13814be 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -82,6 +82,13 @@ of a parenthetical grouping or string-delimiter: the default value nil keeps point at the end of the region, setting it to non-nil moves point to the beginning of the region. ++++ +** The new user option 'confirm-kill-processes' allows the user to +skip a confirmation prompt for killing subprocesses when exiting +Emacs. When set to t (the default), Emacs will prompt for +confirmation before killing subprocesses on exit, which is the same +behavior as before. + --- ** 'find-library-name' will now fall back on looking at 'load-history' to try to locate libraries that have been loaded with an explicit path diff --git a/lisp/files.el b/lisp/files.el index 4bd708d..f481b99 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -6757,11 +6757,22 @@ confirm-kill-emacs :group 'convenience :version "21.1") +(defcustom confirm-kill-processes t + "Non-nil if Emacs should confirm killing processes on exit. +If this variable is nil, the value of +`process-query-on-exit-flag' is ignored. Otherwise, if there are +processes with a non-nil `process-query-on-exit-flag', Emacs will +prompt the user before killing them." + :type 'boolean + :group 'convenience + :version "26.1") + (defun save-buffers-kill-emacs (&optional arg) "Offer to save each buffer, then kill this Emacs process. With prefix ARG, silently save all file-visiting buffers without asking. If there are active processes where `process-query-on-exit-flag' -returns non-nil, asks whether processes should be killed. +returns non-nil and `confirm-kill-processes' is non-nil, +asks whether processes should be killed. Runs the members of `kill-emacs-query-functions' in turn and stops if any returns nil. If `confirm-kill-emacs' is non-nil, calls it." (interactive "P") @@ -6776,6 +6787,7 @@ save-buffers-kill-emacs (yes-or-no-p "Modified buffers exist; exit anyway? "))) (or (not (fboundp 'process-list)) ;; process-list is not defined on MSDOS. + (not confirm-kill-processes) (let ((processes (process-list)) active) (while processes diff --git a/test/lisp/files-tests.el b/test/lisp/files-tests.el index 479848a..80d5e5b 100644 --- a/test/lisp/files-tests.el +++ b/test/lisp/files-tests.el @@ -197,5 +197,28 @@ files-test-bug-18141-file (setenv "FOO" foo-env) (setenv "BAR" bar-env)))) +(ert-deftest files-test--save-buffers-kill-emacs--confirm-kill-processes () + "Test that `save-buffers-kill-emacs' honors +`confirm-kill-processes'." + (cl-letf* ((yes-or-no-p-prompts nil) + ((symbol-function #'yes-or-no-p) + (lambda (prompt) + (push prompt yes-or-no-p-prompts) + nil)) + (kill-emacs-args nil) + ((symbol-function #'kill-emacs) + (lambda (&optional arg) (push arg kill-emacs-args))) + (process + (make-process + :name "sleep" + :command (list + (expand-file-name invocation-name invocation-directory) + "-batch" "-Q" "-eval" "(sleep-for 1000)"))) + (confirm-kill-processes nil)) + (save-buffers-kill-emacs) + (kill-process process) + (should-not yes-or-no-p-prompts) + (should (equal kill-emacs-args '(nil))))) + (provide 'files-tests) ;;; files-tests.el ends here -- 2.10.0