Function: server-buffer-done
server-buffer-done is a byte-compiled function defined in
server.el.gz.
Signature
(server-buffer-done BUFFER &optional FOR-KILLING)
Documentation
Mark BUFFER as "done" for its client(s).
This buries the buffer, then returns a list of the form (NEXT-BUFFER KILLED).
NEXT-BUFFER is another server buffer, as a suggestion for what to select next,
or nil. KILLED is t if we killed BUFFER (typically, because it was visiting
a temp file).
FOR-KILLING if non-nil indicates that we are called from kill-buffer.
Source Code
;; Defined in /usr/src/emacs/lisp/server.el.gz
(defun server-buffer-done (buffer &optional for-killing)
"Mark BUFFER as \"done\" for its client(s).
This buries the buffer, then returns a list of the form (NEXT-BUFFER KILLED).
NEXT-BUFFER is another server buffer, as a suggestion for what to select next,
or nil. KILLED is t if we killed BUFFER (typically, because it was visiting
a temp file).
FOR-KILLING if non-nil indicates that we are called from `kill-buffer'."
(let ((next-buffer nil)
(killed nil))
(dolist (proc server-clients)
(let ((buffers (process-get proc 'buffers)))
(or next-buffer
(setq next-buffer (nth 1 (memq buffer buffers))))
(when buffers ; Ignore bufferless clients.
(setq buffers (delq buffer buffers))
;; Delete all dead buffers from PROC.
(dolist (b buffers)
(and (bufferp b)
(not (buffer-live-p b))
(setq buffers (delq b buffers))))
(process-put proc 'buffers buffers)
;; If client now has no pending buffers,
;; tell it that it is done, and forget it entirely.
(unless buffers
(server-log "Close" proc)
(if for-killing
;; `server-delete-client' might delete the client's
;; frames, which might change the current buffer. We
;; don't want that (bug#640).
(save-current-buffer
(server-delete-client proc
find-alternate-file-dont-kill-client))
(server-delete-client proc))))))
(when (and (bufferp buffer) (buffer-name buffer))
;; We may or may not kill this buffer;
;; if we do, do not call server-buffer-done recursively
;; from kill-buffer-hook.
(let ((server-kill-buffer-running t))
(with-current-buffer buffer
(setq server-buffer-clients nil)
(run-hooks 'server-done-hook))
;; Notice whether server-done-hook killed the buffer.
(if (null (buffer-name buffer))
(setq killed t)
;; Don't bother killing or burying the buffer
;; when we are called from kill-buffer.
(unless for-killing
(when (and (not killed)
server-kill-new-buffers
(with-current-buffer buffer
(not server-existing-buffer)))
(setq killed t)
(bury-buffer buffer)
;; Prevent kill-buffer from prompting (Bug#3696).
(with-current-buffer buffer
(set-buffer-modified-p nil))
(kill-buffer buffer))
(unless killed
(if (server-temp-file-p buffer)
(progn
(with-current-buffer buffer
(set-buffer-modified-p nil))
(kill-buffer buffer)
(setq killed t))
(bury-buffer buffer)))))))
(list next-buffer killed)))