[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#51377: Automatically exit server when it has no remaining clients

From: Jim Porter
Subject: bug#51377: Automatically exit server when it has no remaining clients
Date: Sun, 24 Oct 2021 09:03:13 -0700

On 10/24/2021 8:15 AM, Gregory Heytings wrote:

As discussed in https://lists.gnu.org/archive/html/emacs-devel/2021-10/msg01465.html , an option to stop the Emacs server when it has no clients anymore (which is similar to what some other apps do, for example browsers) would be useful.

Patch attached.

I'm not sure I understand the patch; `save-buffers-kill-emacs' prompts the user to save buffers before killing Emacs, but how would that work in a daemon when there are no frames remaining?

I use a slightly-modified form of the following in my configuration, which I'm working on hooking up to a flag to remember if the daemon was started lazily:


(defun save-buffers-kill-terminal (&optional arg)
  "Offer to save each buffer, then kill the current connection.
If the current frame has no client or is the last client of a daemon,
kill Emacs itself using `save-buffers-kill-emacs'.

With prefix ARG, silently save all file-visiting buffers, then kill.

If emacsclient was started with a list of filenames to edit, then
only these files will be asked to be saved."
  (interactive "P")
  ;; Only kill the terminal if the current frame is a client. However, if
  ;; Emacs was started as a daemon and this is the last client, kill Emacs
  ;; entirely.
  (if-let ((this-client (frame-parameter nil 'client))
           ((not (and (daemonp)
                      (equal server-clients (list this-client))))))
      (server-save-buffers-kill-terminal arg)
    (save-buffers-kill-emacs arg)))

(defun server-kill-emacs-query-function ()
  "Ask before exiting Emacs if it has live clients.
If Emacs was started as a daemon and the only live client is the
current frame's client, don't bother asking."
  (let ((ignored-client (and (daemonp) (frame-parameter nil 'client))))
    (or (not (seq-some (lambda (client)
                         (unless (eq ignored-client client)
                           (seq-some #'buffer-live-p
                                     (process-get client 'buffers))))
        (yes-or-no-p "This Emacs session has clients; exit anyway? "))))


reply via email to

[Prev in Thread] Current Thread [Next in Thread]