aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2002-11-02 05:29:13 +0000
committerStefan Monnier2002-11-02 05:29:13 +0000
commit408784a7d589e1ccc6a04b7cf5f6e82e85e42ff0 (patch)
tree2a292a65850bcdf91d339504c1aae266e3243d8b
parent03c081a88faf2d070779940abeb4133b40d7d03f (diff)
downloademacs-408784a7d589e1ccc6a04b7cf5f6e82e85e42ff0.tar.gz
emacs-408784a7d589e1ccc6a04b7cf5f6e82e85e42ff0.zip
(server-sentinel): Kill buffers if applicable.
(server-temp-file-p): Make arg optional. (server-done): Use it to simplify. (server-switch-buffer): If server-window is a function, use it.
-rw-r--r--lisp/server.el120
1 files changed, 64 insertions, 56 deletions
diff --git a/lisp/server.el b/lisp/server.el
index 4551f40c737..d094ac815d9 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -117,7 +117,9 @@ When a buffer is marked as \"done\", it is removed from this list.")
117(defvar server-window nil 117(defvar server-window nil
118 "*The window to use for selecting Emacs server buffers. 118 "*The window to use for selecting Emacs server buffers.
119If nil, use the selected window. 119If nil, use the selected window.
120If it is a frame, use the frame's selected window.") 120If it is a frame, use the frame's selected window.
121If it is a function, it should take one argument (a buffer) and
122display and select it. A common value is `pop-to-buffer'.")
121 123
122(defcustom server-temp-file-regexp "^/tmp/Re\\|/draft$" 124(defcustom server-temp-file-regexp "^/tmp/Re\\|/draft$"
123 "*Regexp which should match filenames of temporary files 125 "*Regexp which should match filenames of temporary files
@@ -166,13 +168,20 @@ are done with it in the server.")
166 ;; Purge server-previous-strings of the now irrelevant entry. 168 ;; Purge server-previous-strings of the now irrelevant entry.
167 (setq server-previous-strings 169 (setq server-previous-strings
168 (delq (assq proc server-previous-strings) server-previous-strings)) 170 (delq (assq proc server-previous-strings) server-previous-strings))
169 (let ((ps (assq proc server-clients))) 171 (let ((client (assq proc server-clients)))
170 (dolist (buf (cdr ps))
171 (with-current-buffer buf
172 ;; Remove PROC from the clients of each buffer.
173 (setq server-buffer-clients (delq proc server-buffer-clients))))
174 ;; Remove PROC from the list of clients. 172 ;; Remove PROC from the list of clients.
175 (if ps (setq server-clients (delq ps server-clients)))) 173 (when client
174 (setq server-clients (delq client server-clients))
175 (dolist (buf (cdr client))
176 (with-current-buffer buf
177 ;; Remove PROC from the clients of each buffer.
178 (setq server-buffer-clients (delq proc server-buffer-clients))
179 ;; Kill the buffer if necessary.
180 (when (and (null server-buffer-clients)
181 (or (and server-kill-new-buffers
182 (not server-existing-buffer))
183 (server-temp-file-p)))
184 (kill-buffer (current-buffer)))))))
176 (server-log (format "Status changed to %s" (process-status proc)) proc)) 185 (server-log (format "Status changed to %s" (process-status proc)) proc))
177 186
178(defun server-select-display (display) 187(defun server-select-display (display)
@@ -408,8 +417,7 @@ FOR-KILLING if non-nil indicates that we are called from `kill-buffer'."
408 ;; if we do, do not call server-buffer-done recursively 417 ;; if we do, do not call server-buffer-done recursively
409 ;; from kill-buffer-hook. 418 ;; from kill-buffer-hook.
410 (let ((server-kill-buffer-running t)) 419 (let ((server-kill-buffer-running t))
411 (save-excursion 420 (with-current-buffer buffer
412 (set-buffer buffer)
413 (setq server-buffer-clients nil) 421 (setq server-buffer-clients nil)
414 (run-hooks 'server-done-hook)) 422 (run-hooks 'server-done-hook))
415 ;; Notice whether server-done-hook killed the buffer. 423 ;; Notice whether server-done-hook killed the buffer.
@@ -433,7 +441,7 @@ FOR-KILLING if non-nil indicates that we are called from `kill-buffer'."
433 (bury-buffer buffer))))))) 441 (bury-buffer buffer)))))))
434 (list next-buffer killed))) 442 (list next-buffer killed)))
435 443
436(defun server-temp-file-p (buffer) 444(defun server-temp-file-p (&optional buffer)
437 "Return non-nil if BUFFER contains a file considered temporary. 445 "Return non-nil if BUFFER contains a file considered temporary.
438These are files whose names suggest they are repeatedly 446These are files whose names suggest they are repeatedly
439reused to pass information to another program. 447reused to pass information to another program.
@@ -450,20 +458,18 @@ of the form (NEXT-BUFFER KILLED). NEXT-BUFFER is another server buffer,
450as a suggestion for what to select next, or nil. 458as a suggestion for what to select next, or nil.
451KILLED is t if we killed BUFFER, which happens if it was created 459KILLED is t if we killed BUFFER, which happens if it was created
452specifically for the clients and did not exist before their request for it." 460specifically for the clients and did not exist before their request for it."
453 (let ((buffer (current-buffer))) 461 (when server-buffer-clients
454 (if server-buffer-clients 462 (if (server-temp-file-p)
455 (progn 463 ;; For a temp file, save, and do make a non-numeric backup
456 (if (server-temp-file-p buffer) 464 ;; (unless make-backup-files is nil).
457 ;; For a temp file, save, and do make a non-numeric backup 465 (let ((version-control nil)
458 ;; (unless make-backup-files is nil). 466 (buffer-backed-up nil))
459 (let ((version-control nil) 467 (save-buffer))
460 (buffer-backed-up nil)) 468 (if (and (buffer-modified-p)
461 (save-buffer)) 469 buffer-file-name
462 (if (and (buffer-modified-p) 470 (y-or-n-p (concat "Save file " buffer-file-name "? ")))
463 buffer-file-name 471 (save-buffer)))
464 (y-or-n-p (concat "Save file " buffer-file-name "? "))) 472 (server-buffer-done (current-buffer))))
465 (save-buffer)))
466 (server-buffer-done buffer)))))
467 473
468;; Ask before killing a server buffer. 474;; Ask before killing a server buffer.
469;; It was suggested to release its client instead, 475;; It was suggested to release its client instead,
@@ -541,38 +547,40 @@ Arg NEXT-BUFFER is a suggestion; if it is a live buffer, use it."
541 ;; and try the next surviving server buffer. 547 ;; and try the next surviving server buffer.
542 (apply 'server-switch-buffer (server-buffer-done next-buffer)) 548 (apply 'server-switch-buffer (server-buffer-done next-buffer))
543 ;; OK, we know next-buffer is live, let's display and select it. 549 ;; OK, we know next-buffer is live, let's display and select it.
544 (let ((win (get-buffer-window next-buffer 0))) 550 (if (functionp server-window)
545 (if (and win (not server-window)) 551 (funcall server-window next-buffer)
546 ;; The buffer is already displayed: just reuse the window. 552 (let ((win (get-buffer-window next-buffer 0)))
547 (let ((frame (window-frame win))) 553 (if (and win (not server-window))
548 (if (eq (frame-visible-p frame) 'icon) 554 ;; The buffer is already displayed: just reuse the window.
549 (raise-frame frame)) 555 (let ((frame (window-frame win)))
550 (select-window win) 556 (if (eq (frame-visible-p frame) 'icon)
551 (set-buffer next-buffer)) 557 (raise-frame frame))
552 ;; Otherwise, let's find an appropriate window. 558 (select-window win)
553 (cond ((and (windowp server-window) 559 (set-buffer next-buffer))
554 (window-live-p server-window)) 560 ;; Otherwise, let's find an appropriate window.
555 (select-window server-window)) 561 (cond ((and (windowp server-window)
556 ((framep server-window) 562 (window-live-p server-window))
557 (if (not (frame-live-p server-window)) 563 (select-window server-window))
558 (setq server-window (make-frame))) 564 ((framep server-window)
559 (select-window (frame-selected-window server-window)))) 565 (if (not (frame-live-p server-window))
560 (if (window-minibuffer-p (selected-window)) 566 (setq server-window (make-frame)))
561 (select-window (next-window nil 'nomini 0))) 567 (select-window (frame-selected-window server-window))))
562 ;; Move to a non-dedicated window, if we have one. 568 (if (window-minibuffer-p (selected-window))
563 (when (window-dedicated-p (selected-window)) 569 (select-window (next-window nil 'nomini 0)))
564 (select-window 570 ;; Move to a non-dedicated window, if we have one.
565 (get-window-with-predicate 571 (when (window-dedicated-p (selected-window))
566 (lambda (w) 572 (select-window
567 (and (not (window-dedicated-p w)) 573 (get-window-with-predicate
568 (equal (frame-parameter (window-frame w) 'display) 574 (lambda (w)
569 (frame-parameter (selected-frame) 'display)))) 575 (and (not (window-dedicated-p w))
570 'nomini 'visible (selected-window)))) 576 (equal (frame-parameter (window-frame w) 'display)
571 (condition-case nil 577 (frame-parameter (selected-frame) 'display))))
572 (switch-to-buffer next-buffer) 578 'nomini 'visible (selected-window))))
573 ;; After all the above, we might still have ended up with 579 (condition-case nil
574 ;; a minibuffer/dedicated-window (if there's no other). 580 (switch-to-buffer next-buffer)
575 (error (pop-to-buffer next-buffer)))))))) 581 ;; After all the above, we might still have ended up with
582 ;; a minibuffer/dedicated-window (if there's no other).
583 (error (pop-to-buffer next-buffer)))))))))
576 584
577(global-set-key "\C-x#" 'server-edit) 585(global-set-key "\C-x#" 'server-edit)
578 586