(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,
(select-window (next-window nil 'nomini 0)))
;; Move to a non-dedicated window, if we have one.
(when (window-dedicated-p (selected-window))
- (select-window (some-window (lambda (w) (not (window-dedicated-p w)))
- 'nomini 'visible (selected-window))))
+ (select-window (get-window-with-predicate
+ (lambda (w) (not (window-dedicated-p w)))
+ 'nomini 'visible (selected-window))))
(set-window-dedicated-p (selected-window) nil)
(if next-buffer
(if (and (bufferp next-buffer)
(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)