aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/server.el69
1 files changed, 38 insertions, 31 deletions
diff --git a/lisp/server.el b/lisp/server.el
index bfebf2fcb92..67aaaee3806 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -147,10 +147,9 @@ this way."
147 (setq minor-mode-alist (cons '(server-buffer-clients " Server") minor-mode-alist))) 147 (setq minor-mode-alist (cons '(server-buffer-clients " Server") minor-mode-alist)))
148 148
149(defvar server-existing-buffer nil 149(defvar server-existing-buffer nil
150 "Non-nil means a buffer existed before the Emacs server was asked visit it. 150 "Non-nil means the buffer existed before the server was asked to visit it.
151This means that the server should not kill the buffer when you say you 151This means that the server should not kill the buffer when you say you
152are done with it in the server. This variable is local in each buffer 152are done with it in the server.")
153where it is set.")
154(make-variable-buffer-local 'server-existing-buffer) 153(make-variable-buffer-local 'server-existing-buffer)
155 154
156;; If a *server* buffer exists, 155;; If a *server* buffer exists,
@@ -447,7 +446,7 @@ specifically for the clients and did not exist before their request for it."
447 (if (and (buffer-modified-p) 446 (if (and (buffer-modified-p)
448 buffer-file-name 447 buffer-file-name
449 (y-or-n-p (concat "Save file " buffer-file-name "? "))) 448 (y-or-n-p (concat "Save file " buffer-file-name "? ")))
450 (save-buffer buffer))) 449 (save-buffer)))
451 (server-buffer-done buffer))))) 450 (server-buffer-done buffer)))))
452 451
453;; Ask before killing a server buffer. 452;; Ask before killing a server buffer.
@@ -517,34 +516,42 @@ Arg NEXT-BUFFER is a suggestion; if it is a live buffer, use it."
517 ;; if we have already killed one temp-file server buffer. 516 ;; if we have already killed one temp-file server buffer.
518 ;; This means we should avoid the final "switch to some other buffer" 517 ;; This means we should avoid the final "switch to some other buffer"
519 ;; since we've already effectively done that. 518 ;; since we've already effectively done that.
520 (cond ((and (windowp server-window) 519 (if (null next-buffer)
521 (window-live-p server-window)) 520 (if server-clients
522 (select-window server-window)) 521 (server-switch-buffer (nth 1 (car server-clients)) killed-one)
523 ((framep server-window) 522 (unless (or killed-one
524 (if (not (frame-live-p server-window)) 523 (window-dedicated-p (selected-window)))
525 (setq server-window (make-frame))) 524 (switch-to-buffer (other-buffer))))
526 (select-window (frame-selected-window server-window)))) 525 (if (not (buffer-name next-buffer))
527 (if (window-minibuffer-p (selected-window)) 526 ;; If NEXT-BUFFER is a dead buffer, remove the server records for it
528 (select-window (next-window nil 'nomini 0)))
529 ;; Move to a non-dedicated window, if we have one.
530 (when (window-dedicated-p (selected-window))
531 (select-window (get-window-with-predicate
532 (lambda (w) (not (window-dedicated-p w)))
533 'nomini 'visible (selected-window))))
534 (set-window-dedicated-p (selected-window) nil)
535 (if next-buffer
536 (if (and (bufferp next-buffer)
537 (buffer-name next-buffer))
538 (switch-to-buffer next-buffer)
539 ;; If NEXT-BUFFER is a dead buffer,
540 ;; remove the server records for it
541 ;; and try the next surviving server buffer. 527 ;; and try the next surviving server buffer.
542 (apply 'server-switch-buffer 528 (apply 'server-switch-buffer (server-buffer-done next-buffer))
543 (server-buffer-done next-buffer))) 529 ;; OK, we know next-buffer is live, let's display and select it.
544 (if server-clients 530 (let ((win (get-buffer-window next-buffer 0)))
545 (server-switch-buffer (nth 1 (car server-clients)) killed-one) 531 (if (and win (not server-window))
546 (if (not killed-one) 532 ;; The buffer is already displayed: just reuse the window.
547 (switch-to-buffer (other-buffer)))))) 533 (let ((frame (window-frame win)))
534 (if (eq (frame-visible-p frame) 'icon)
535 (raise-frame frame))
536 (select-window win)
537 (set-buffer next-buffer))
538 ;; Otherwise, let's find an appropriate window.
539 (cond ((and (windowp server-window)
540 (window-live-p server-window))
541 (select-window server-window))
542 ((framep server-window)
543 (if (not (frame-live-p server-window))
544 (setq server-window (make-frame)))
545 (select-window (frame-selected-window server-window))))
546 (if (window-minibuffer-p (selected-window))
547 (select-window (next-window nil 'nomini 0)))
548 ;; Move to a non-dedicated window, if we have one.
549 (when (window-dedicated-p (selected-window))
550 (select-window (get-window-with-predicate
551 (lambda (w) (not (window-dedicated-p w)))
552 'nomini 'visible (selected-window))))
553 (set-window-dedicated-p (selected-window) nil)
554 (switch-to-buffer next-buffer))))))
548 555
549(global-set-key "\C-x#" 'server-edit) 556(global-set-key "\C-x#" 'server-edit)
550 557