diff options
| author | Stefan Monnier | 2002-11-02 05:29:13 +0000 |
|---|---|---|
| committer | Stefan Monnier | 2002-11-02 05:29:13 +0000 |
| commit | 408784a7d589e1ccc6a04b7cf5f6e82e85e42ff0 (patch) | |
| tree | 2a292a65850bcdf91d339504c1aae266e3243d8b | |
| parent | 03c081a88faf2d070779940abeb4133b40d7d03f (diff) | |
| download | emacs-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.el | 120 |
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. |
| 119 | If nil, use the selected window. | 119 | If nil, use the selected window. |
| 120 | If it is a frame, use the frame's selected window.") | 120 | If it is a frame, use the frame's selected window. |
| 121 | If it is a function, it should take one argument (a buffer) and | ||
| 122 | display 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. |
| 438 | These are files whose names suggest they are repeatedly | 446 | These are files whose names suggest they are repeatedly |
| 439 | reused to pass information to another program. | 447 | reused to pass information to another program. |
| @@ -450,20 +458,18 @@ of the form (NEXT-BUFFER KILLED). NEXT-BUFFER is another server buffer, | |||
| 450 | as a suggestion for what to select next, or nil. | 458 | as a suggestion for what to select next, or nil. |
| 451 | KILLED is t if we killed BUFFER, which happens if it was created | 459 | KILLED is t if we killed BUFFER, which happens if it was created |
| 452 | specifically for the clients and did not exist before their request for it." | 460 | specifically 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 | ||