(setq minor-mode-alist (cons '(server-buffer-clients " Server") minor-mode-alist)))
(defvar server-existing-buffer nil
- "Non-nil means a server buffer existed before visiting a file.")
+ "Non-nil means a buffer existed before the Emacs server was asked visit it.
+This means that the server should not kill the buffer when you say you
+are done with it in the server. This variable is local in each buffer
+where it is set.")
(make-variable-buffer-local 'server-existing-buffer)
;; If a *server* buffer exists,
files))
(setq lineno 1)
(setq columnno 0))))))
+ (run-hooks 'pre-command-hook)
(server-visit-files files client nowait)
+ (run-hooks 'post-command-hook)
;; CLIENT is now a list (CLIENTNUM BUFFERS...)
(if (null (cdr client))
;; This client is empty; get rid of it immediately.
(unless for-killing
(when (and (not killed)
server-kill-new-buffers
- (save-excursion
- (set-buffer buffer)
- server-existing-buffer))
+ (with-current-buffer buffer
+ (not server-existing-buffer)))
(setq killed t)
(bury-buffer buffer)
(kill-buffer buffer))
(defun server-done ()
"Offer to save current buffer, mark it as \"done\" for clients.
-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)."
+This kills or 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, which happens if it was created
+specifically for the clients and did not exist before their request for it."
(let ((buffer (current-buffer)))
(if server-buffer-clients
(progn
(defun server-edit (&optional arg)
"Switch to next server editing buffer; say \"Done\" for current buffer.
If a server buffer is current, it is marked \"done\" and optionally saved.
+The buffer is also killed if it did not exist before the clients asked for it.
When all of a client's buffers are marked as \"done\", the client is notified.
Temporary files such as MH <draft> files are always saved and backed up,
(switch-to-buffer (other-buffer))))))
(global-set-key "\C-x#" 'server-edit)
+
+(defun server-unload-hook ()
+ (remove-hook 'kill-buffer-query-functions 'server-kill-buffer-query-function)
+ (remove-hook 'kill-emacs-query-functions 'server-kill-emacs-query-function)
+ (remove-hook 'kill-buffer-hook 'server-kill-buffer))
\f
(provide 'server)