Mercurial > emacs
annotate lisp/server.el @ 72598:070fe1ef3250
* buffers.texi (Buffer Modification): Document
buffer-chars-modified-tick.
author | Chong Yidong <cyd@stupidchicken.com> |
---|---|
date | Fri, 01 Sep 2006 13:41:33 +0000 |
parents | dcb7e8b2f7b3 |
children | fa022f5f8164 2d56e13fd23d 8a8e69664178 |
rev | line source |
---|---|
38412
253f761ad37b
Some fixes to follow coding conventions in files maintained by FSF.
Pavel Janík <Pavel@Janik.cz>
parents:
38010
diff
changeset
|
1 ;;; server.el --- Lisp code for GNU Emacs running as server process |
658
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
445
diff
changeset
|
2 |
64762
41bb365f41c4
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
64372
diff
changeset
|
3 ;; Copyright (C) 1986, 1987, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000, |
68651
3bd95f4f2941
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
66388
diff
changeset
|
4 ;; 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. |
844
bf829a2d63b4
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
814
diff
changeset
|
5 |
787
3cece0106722
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
702
diff
changeset
|
6 ;; Author: William Sommerfeld <wesommer@athena.mit.edu> |
17970 | 7 ;; Maintainer: FSF |
814
38b2499cb3e9
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
807
diff
changeset
|
8 ;; Keywords: processes |
787
3cece0106722
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
702
diff
changeset
|
9 |
3cece0106722
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
702
diff
changeset
|
10 ;; Changes by peck@sun.com and by rms. |
3cece0106722
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
702
diff
changeset
|
11 |
50 | 12 ;; This file is part of GNU Emacs. |
13 | |
14 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
15 ;; it under the terms of the GNU General Public License as published by | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
787
diff
changeset
|
16 ;; the Free Software Foundation; either version 2, or (at your option) |
50 | 17 ;; any later version. |
18 | |
19 ;; GNU Emacs is distributed in the hope that it will be useful, | |
20 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
21 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
22 ;; GNU General Public License for more details. | |
23 | |
24 ;; You should have received a copy of the GNU General Public License | |
14169 | 25 ;; along with GNU Emacs; see the file COPYING. If not, write to the |
64091 | 26 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
27 ;; Boston, MA 02110-1301, USA. | |
50 | 28 |
787
3cece0106722
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
702
diff
changeset
|
29 ;;; Commentary: |
50 | 30 |
14169 | 31 ;; This Lisp code is run in Emacs when it is to operate as |
32 ;; a server for other processes. | |
50 | 33 |
14169 | 34 ;; Load this library and do M-x server-edit to enable Emacs as a server. |
47645
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
35 ;; Emacs opens up a socket for communication with clients. If there are no |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
36 ;; client buffers to edit, server-edit acts like (switch-to-buffer |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
37 ;; (other-buffer)) |
50 | 38 |
14169 | 39 ;; When some other program runs "the editor" to edit a file, |
40 ;; "the editor" can be the Emacs client program ../lib-src/emacsclient. | |
41 ;; This program transmits the file names to Emacs through | |
42 ;; the server subprocess, and Emacs visits them and lets you edit them. | |
50 | 43 |
14169 | 44 ;; Note that any number of clients may dispatch files to emacs to be edited. |
50 | 45 |
14169 | 46 ;; When you finish editing a Server buffer, again call server-edit |
49206
7ebd98bb02a2
(server-process-filter): Use `minibufferp' to test
John Paul Wallington <jpw@pobox.com>
parents:
49187
diff
changeset
|
47 ;; to mark that buffer as done for the client and switch to the next |
7ebd98bb02a2
(server-process-filter): Use `minibufferp' to test
John Paul Wallington <jpw@pobox.com>
parents:
49187
diff
changeset
|
48 ;; Server buffer. When all the buffers for a client have been edited |
14169 | 49 ;; and exited with server-edit, the client "editor" will return |
49206
7ebd98bb02a2
(server-process-filter): Use `minibufferp' to test
John Paul Wallington <jpw@pobox.com>
parents:
49187
diff
changeset
|
50 ;; to the program that invoked it. |
50 | 51 |
14169 | 52 ;; Your editing commands and Emacs's display output go to and from |
53 ;; the terminal in the usual way. Thus, server operation is possible | |
54 ;; only when Emacs can talk to the terminal at the time you invoke | |
55 ;; the client. This is possible in four cases: | |
50 | 56 |
14169 | 57 ;; 1. On a window system, where Emacs runs in one window and the |
58 ;; program that wants to use "the editor" runs in another. | |
50 | 59 |
14169 | 60 ;; 2. On a multi-terminal system, where Emacs runs on one terminal and the |
61 ;; program that wants to use "the editor" runs on another. | |
50 | 62 |
14169 | 63 ;; 3. When the program that wants to use "the editor" is running |
64 ;; as a subprocess of Emacs. | |
50 | 65 |
14169 | 66 ;; 4. On a system with job control, when Emacs is suspended, the program |
67 ;; that wants to use "the editor" will stop and display | |
68 ;; "Waiting for Emacs...". It can then be suspended, and Emacs can be | |
69 ;; brought into the foreground for editing. When done editing, Emacs is | |
70 ;; suspended again, and the client program is brought into the foreground. | |
50 | 71 |
49206
7ebd98bb02a2
(server-process-filter): Use `minibufferp' to test
John Paul Wallington <jpw@pobox.com>
parents:
49187
diff
changeset
|
72 ;; The buffer local variable "server-buffer-clients" lists |
7ebd98bb02a2
(server-process-filter): Use `minibufferp' to test
John Paul Wallington <jpw@pobox.com>
parents:
49187
diff
changeset
|
73 ;; the clients who are waiting for this buffer to be edited. |
14169 | 74 ;; The global variable "server-clients" lists all the waiting clients, |
75 ;; and which files are yet to be edited for each. | |
787
3cece0106722
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
702
diff
changeset
|
76 |
3cece0106722
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
702
diff
changeset
|
77 ;;; Code: |
47517
8e9589a87f9b
(server-log): Add `client' arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46907
diff
changeset
|
78 |
8e9589a87f9b
(server-log): Add `client' arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46907
diff
changeset
|
79 (eval-when-compile (require 'cl)) |
8e9589a87f9b
(server-log): Add `client' arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46907
diff
changeset
|
80 |
19418 | 81 (defgroup server nil |
82 "Emacs running as a server process." | |
83 :group 'external) | |
50 | 84 |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
85 (defcustom server-visit-hook nil |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
86 "*Hook run when visiting a file for the Emacs server." |
19418 | 87 :group 'server |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
88 :type 'hook) |
50 | 89 |
19418 | 90 (defcustom server-switch-hook nil |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
91 "*Hook run when switching to a buffer for the Emacs server." |
19418 | 92 :group 'server |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
93 :type 'hook) |
19418 | 94 |
95 (defcustom server-done-hook nil | |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
96 "*Hook run when done editing a buffer for the Emacs server." |
19418 | 97 :group 'server |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
98 :type 'hook) |
7597
99a600c67e82
(server-done-hook): New hook.
Richard M. Stallman <rms@gnu.org>
parents:
7553
diff
changeset
|
99 |
49206
7ebd98bb02a2
(server-process-filter): Use `minibufferp' to test
John Paul Wallington <jpw@pobox.com>
parents:
49187
diff
changeset
|
100 (defvar server-process nil |
7ebd98bb02a2
(server-process-filter): Use `minibufferp' to test
John Paul Wallington <jpw@pobox.com>
parents:
49187
diff
changeset
|
101 "The current server process.") |
50 | 102 |
103 (defvar server-clients nil | |
104 "List of current server clients. | |
7736
8c8410bc0f1b
(server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents:
7597
diff
changeset
|
105 Each element is (CLIENTID BUFFERS...) where CLIENTID is a string |
50 | 106 that can be given to the server process to identify a client. |
107 When a buffer is marked as \"done\", it is removed from this list.") | |
108 | |
109 (defvar server-buffer-clients nil | |
38010
8a8cf4d74475
(server-process, server-buffer-clients): Doc fix.
Eli Zaretskii <eliz@gnu.org>
parents:
37273
diff
changeset
|
110 "List of client ids for clients requesting editing of current buffer.") |
6176
1dbec303c87b
(kill-emacs-query-functions, kill-buffer-query-functions):
Richard M. Stallman <rms@gnu.org>
parents:
5749
diff
changeset
|
111 (make-variable-buffer-local 'server-buffer-clients) |
50 | 112 ;; Changing major modes should not erase this local. |
113 (put 'server-buffer-clients 'permanent-local t) | |
114 | |
49267 | 115 (defcustom server-window nil |
116 "*Specification of the window to use for selecting Emacs server buffers. | |
3661
65d530f613a8
(server-window): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
2866
diff
changeset
|
117 If nil, use the selected window. |
49267 | 118 If it is a function, it should take one argument (a buffer) and |
119 display and select it. A common value is `pop-to-buffer'. | |
120 If it is a window, use that. | |
48123
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
121 If it is a frame, use the frame's selected window. |
49267 | 122 |
123 It is not meaningful to set this to a specific frame or window with Custom. | |
124 Only programs can do so." | |
125 :group 'server | |
59996
aac0a33f5772
Change release version from 21.4 to 22.1 throughout.
Kim F. Storm <storm@cua.dk>
parents:
59220
diff
changeset
|
126 :version "22.1" |
49267 | 127 :type '(choice (const :tag "Use selected window" |
128 :match (lambda (widget value) | |
129 (not (functionp value))) | |
130 nil) | |
131 (function-item :tag "Use pop-to-buffer" pop-to-buffer) | |
132 (function :tag "Other function"))) | |
3661
65d530f613a8
(server-window): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
2866
diff
changeset
|
133 |
19418 | 134 (defcustom server-temp-file-regexp "^/tmp/Re\\|/draft$" |
49267 | 135 "*Regexp matching names of temporary files. |
136 These are deleted and reused after each edit by the programs that | |
137 invoke the Emacs server." | |
19418 | 138 :group 'server |
139 :type 'regexp) | |
50 | 140 |
31008
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
141 (defcustom server-kill-new-buffers t |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
142 "*Whether to kill buffers when done with them. |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
143 If non-nil, kill a buffer unless it already existed before editing |
49206
7ebd98bb02a2
(server-process-filter): Use `minibufferp' to test
John Paul Wallington <jpw@pobox.com>
parents:
49187
diff
changeset
|
144 it with Emacs server. If nil, kill only buffers as specified by |
31008
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
145 `server-temp-file-regexp'. |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
146 Please note that only buffers are killed that still have a client, |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
147 i.e. buffers visited which \"emacsclient --no-wait\" are never killed in |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
148 this way." |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
149 :group 'server |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
150 :type 'boolean |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
151 :version "21.1") |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
152 |
50 | 153 (or (assq 'server-buffer-clients minor-mode-alist) |
154 (setq minor-mode-alist (cons '(server-buffer-clients " Server") minor-mode-alist))) | |
155 | |
31008
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
156 (defvar server-existing-buffer nil |
47524
95ba2ac51138
(server-done): Fix harmlessly wrong arg to save-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47517
diff
changeset
|
157 "Non-nil means the buffer existed before the server was asked to visit it. |
40915
e26c1e76e1ca
(server-buffer-done): Test of server-existing-buffer was backwards.
Richard M. Stallman <rms@gnu.org>
parents:
39177
diff
changeset
|
158 This means that the server should not kill the buffer when you say you |
47524
95ba2ac51138
(server-done): Fix harmlessly wrong arg to save-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47517
diff
changeset
|
159 are done with it in the server.") |
31008
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
160 (make-variable-buffer-local 'server-existing-buffer) |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
161 |
54357
367f0279478f
(server-name): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53736
diff
changeset
|
162 (defvar server-name "server") |
367f0279478f
(server-name): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53736
diff
changeset
|
163 |
367f0279478f
(server-name): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53736
diff
changeset
|
164 (defvar server-socket-dir |
367f0279478f
(server-name): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53736
diff
changeset
|
165 (format "/tmp/emacs%d" (user-uid))) |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
166 |
47517
8e9589a87f9b
(server-log): Add `client' arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46907
diff
changeset
|
167 (defun server-log (string &optional client) |
49267 | 168 "If a *server* buffer exists, write STRING to it for logging purposes." |
50 | 169 (if (get-buffer "*server*") |
47517
8e9589a87f9b
(server-log): Add `client' arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46907
diff
changeset
|
170 (with-current-buffer "*server*" |
50 | 171 (goto-char (point-max)) |
47517
8e9589a87f9b
(server-log): Add `client' arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46907
diff
changeset
|
172 (insert (current-time-string) |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
173 (if client (format " %s:" client) " ") |
47517
8e9589a87f9b
(server-log): Add `client' arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46907
diff
changeset
|
174 string) |
13468
2c8da6b3b9e0
(server-log): Record the current time.
Richard M. Stallman <rms@gnu.org>
parents:
13157
diff
changeset
|
175 (or (bolp) (newline))))) |
50 | 176 |
177 (defun server-sentinel (proc msg) | |
48123
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
178 (let ((client (assq proc server-clients))) |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
179 ;; Remove PROC from the list of clients. |
48123
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
180 (when client |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
181 (setq server-clients (delq client server-clients)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
182 (dolist (buf (cdr client)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
183 (with-current-buffer buf |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
184 ;; Remove PROC from the clients of each buffer. |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
185 (setq server-buffer-clients (delq proc server-buffer-clients)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
186 ;; Kill the buffer if necessary. |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
187 (when (and (null server-buffer-clients) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
188 (or (and server-kill-new-buffers |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
189 (not server-existing-buffer)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
190 (server-temp-file-p))) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
191 (kill-buffer (current-buffer))))))) |
66388
ad0d12f9aa9e
(server-sentinel): Set query-on-exit flag to nil on new client processes
Romain Francoise <romain@orebokech.com>
parents:
65582
diff
changeset
|
192 ;; If this is a new client process, set the query-on-exit flag to nil |
ad0d12f9aa9e
(server-sentinel): Set query-on-exit flag to nil on new client processes
Romain Francoise <romain@orebokech.com>
parents:
65582
diff
changeset
|
193 ;; for this process (it isn't inherited from the server process). |
ad0d12f9aa9e
(server-sentinel): Set query-on-exit flag to nil on new client processes
Romain Francoise <romain@orebokech.com>
parents:
65582
diff
changeset
|
194 (when (and (eq (process-status proc) 'open) |
ad0d12f9aa9e
(server-sentinel): Set query-on-exit flag to nil on new client processes
Romain Francoise <romain@orebokech.com>
parents:
65582
diff
changeset
|
195 (process-query-on-exit-flag proc)) |
ad0d12f9aa9e
(server-sentinel): Set query-on-exit flag to nil on new client processes
Romain Francoise <romain@orebokech.com>
parents:
65582
diff
changeset
|
196 (set-process-query-on-exit-flag proc nil)) |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
197 (server-log (format "Status changed to %s" (process-status proc)) proc)) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
198 |
47645
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
199 (defun server-select-display (display) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
200 ;; If the current frame is on `display' we're all set. |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
201 (unless (equal (frame-parameter (selected-frame) 'display) display) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
202 ;; Otherwise, look for an existing frame there and select it. |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
203 (dolist (frame (frame-list)) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
204 (when (equal (frame-parameter frame 'display) display) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
205 (select-frame frame))) |
71650
dcb7e8b2f7b3
* server.el (server-select-display): Don't make the temp frame
Chong Yidong <cyd@stupidchicken.com>
parents:
71320
diff
changeset
|
206 ;; If there's no frame on that display yet, create and select one. |
47645
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
207 (unless (equal (frame-parameter (selected-frame) 'display) display) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
208 (select-frame |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
209 (make-frame-on-display |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
210 display |
71650
dcb7e8b2f7b3
* server.el (server-select-display): Don't make the temp frame
Chong Yidong <cyd@stupidchicken.com>
parents:
71320
diff
changeset
|
211 ;; This frame may be deleted later (see server-process-filter) |
dcb7e8b2f7b3
* server.el (server-select-display): Don't make the temp frame
Chong Yidong <cyd@stupidchicken.com>
parents:
71320
diff
changeset
|
212 ;; so we want it to be as unobtrusive as possible. |
dcb7e8b2f7b3
* server.el (server-select-display): Don't make the temp frame
Chong Yidong <cyd@stupidchicken.com>
parents:
71320
diff
changeset
|
213 '((visibility . nil))))))) |
47645
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
214 |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
215 (defun server-unquote-arg (arg) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
216 (replace-regexp-in-string |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
217 "&." (lambda (s) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
218 (case (aref s 1) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
219 (?& "&") |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
220 (?- "-") |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
221 (?n "\n") |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
222 (t " "))) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
223 arg t t)) |
50 | 224 |
50567
1b32397dd4e2
(server-socket-name): Use new safe location for socket.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49686
diff
changeset
|
225 (defun server-ensure-safe-dir (dir) |
1b32397dd4e2
(server-socket-name): Use new safe location for socket.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49686
diff
changeset
|
226 "Make sure DIR is a directory with no race-condition issues. |
1b32397dd4e2
(server-socket-name): Use new safe location for socket.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49686
diff
changeset
|
227 Creates the directory if necessary and makes sure: |
1b32397dd4e2
(server-socket-name): Use new safe location for socket.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49686
diff
changeset
|
228 - there's no symlink involved |
1b32397dd4e2
(server-socket-name): Use new safe location for socket.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49686
diff
changeset
|
229 - it's owned by us |
1b32397dd4e2
(server-socket-name): Use new safe location for socket.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49686
diff
changeset
|
230 - it's not readable/writable by anybody else." |
1b32397dd4e2
(server-socket-name): Use new safe location for socket.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49686
diff
changeset
|
231 (setq dir (directory-file-name dir)) |
1b32397dd4e2
(server-socket-name): Use new safe location for socket.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49686
diff
changeset
|
232 (let ((attrs (file-attributes dir))) |
1b32397dd4e2
(server-socket-name): Use new safe location for socket.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49686
diff
changeset
|
233 (unless attrs |
1b32397dd4e2
(server-socket-name): Use new safe location for socket.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49686
diff
changeset
|
234 (letf (((default-file-modes) ?\700)) (make-directory dir)) |
1b32397dd4e2
(server-socket-name): Use new safe location for socket.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49686
diff
changeset
|
235 (setq attrs (file-attributes dir))) |
1b32397dd4e2
(server-socket-name): Use new safe location for socket.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49686
diff
changeset
|
236 ;; Check that it's safe for use. |
1b32397dd4e2
(server-socket-name): Use new safe location for socket.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49686
diff
changeset
|
237 (unless (and (eq t (car attrs)) (eq (nth 2 attrs) (user-uid)) |
1b32397dd4e2
(server-socket-name): Use new safe location for socket.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49686
diff
changeset
|
238 (zerop (logand ?\077 (file-modes dir)))) |
1b32397dd4e2
(server-socket-name): Use new safe location for socket.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49686
diff
changeset
|
239 (error "The directory %s is unsafe" dir)))) |
1b32397dd4e2
(server-socket-name): Use new safe location for socket.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49686
diff
changeset
|
240 |
256 | 241 ;;;###autoload |
50 | 242 (defun server-start (&optional leave-dead) |
243 "Allow this Emacs process to be a server for client processes. | |
244 This starts a server communications subprocess through which | |
245 client \"editors\" can send your editing commands to this Emacs job. | |
7855
69ec123ef310
(server-start): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
7736
diff
changeset
|
246 To use the server, set up the program `emacsclient' in the |
50 | 247 Emacs distribution as your standard \"editor\". |
248 | |
249 Prefix arg means just kill any existing server communications subprocess." | |
250 (interactive "P") | |
251 ;; kill it dead! | |
52045
283657e79b56
(server-start): Check `server-process' is non-nil
John Paul Wallington <jpw@pobox.com>
parents:
50568
diff
changeset
|
252 (if server-process |
283657e79b56
(server-start): Check `server-process' is non-nil
John Paul Wallington <jpw@pobox.com>
parents:
50568
diff
changeset
|
253 (condition-case () (delete-process server-process) (error nil))) |
16789
85b1a10101ff
(server-start): Don't delete ~/.emacs-server.
Richard M. Stallman <rms@gnu.org>
parents:
16075
diff
changeset
|
254 ;; Delete the socket files made by previous server invocations. |
54357
367f0279478f
(server-name): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53736
diff
changeset
|
255 (condition-case () |
367f0279478f
(server-name): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53736
diff
changeset
|
256 (delete-file (expand-file-name server-name server-socket-dir)) |
367f0279478f
(server-name): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53736
diff
changeset
|
257 (error nil)) |
16789
85b1a10101ff
(server-start): Don't delete ~/.emacs-server.
Richard M. Stallman <rms@gnu.org>
parents:
16075
diff
changeset
|
258 ;; If this Emacs already had a server, clear out associated status. |
50 | 259 (while server-clients |
260 (let ((buffer (nth 1 (car server-clients)))) | |
261 (server-buffer-done buffer))) | |
70672
06de67179ba1
(server-start): Only create a directory if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
70420
diff
changeset
|
262 ;; Now any previous server is properly stopped. |
47517
8e9589a87f9b
(server-log): Add `client' arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46907
diff
changeset
|
263 (unless leave-dead |
70672
06de67179ba1
(server-start): Only create a directory if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
70420
diff
changeset
|
264 ;; Make sure there is a safe directory in which to place the socket. |
06de67179ba1
(server-start): Only create a directory if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
70420
diff
changeset
|
265 (server-ensure-safe-dir server-socket-dir) |
50 | 266 (if server-process |
267 (server-log (message "Restarting server"))) | |
50568
6958557aad9b
(server-start): Use letf.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
50567
diff
changeset
|
268 (letf (((default-file-modes) ?\700)) |
6958557aad9b
(server-start): Use letf.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
50567
diff
changeset
|
269 (setq server-process |
6958557aad9b
(server-start): Use letf.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
50567
diff
changeset
|
270 (make-network-process |
6958557aad9b
(server-start): Use letf.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
50567
diff
changeset
|
271 :name "server" :family 'local :server t :noquery t |
54357
367f0279478f
(server-name): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53736
diff
changeset
|
272 :service (expand-file-name server-name server-socket-dir) |
50568
6958557aad9b
(server-start): Use letf.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
50567
diff
changeset
|
273 :sentinel 'server-sentinel :filter 'server-process-filter |
6958557aad9b
(server-start): Use letf.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
50567
diff
changeset
|
274 ;; We must receive file names without being decoded. |
6958557aad9b
(server-start): Use letf.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
50567
diff
changeset
|
275 ;; Those are decoded by server-process-filter according |
6958557aad9b
(server-start): Use letf.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
50567
diff
changeset
|
276 ;; to file-name-coding-system. |
6958557aad9b
(server-start): Use letf.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
50567
diff
changeset
|
277 :coding 'raw-text))))) |
49267 | 278 |
279 ;;;###autoload | |
280 (define-minor-mode server-mode | |
281 "Toggle Server mode. | |
282 With ARG, turn Server mode on if ARG is positive, off otherwise. | |
283 Server mode runs a process that accepts commands from the | |
284 `emacsclient' program. See `server-start' and Info node `Emacs server'." | |
285 :global t | |
286 :group 'server | |
59996
aac0a33f5772
Change release version from 21.4 to 22.1 throughout.
Kim F. Storm <storm@cua.dk>
parents:
59220
diff
changeset
|
287 :version "22.1" |
49267 | 288 ;; Fixme: Should this check for an existing server socket and do |
289 ;; nothing if there is one (for multiple Emacs sessions)? | |
290 (server-start (not server-mode))) | |
50 | 291 |
292 (defun server-process-filter (proc string) | |
49267 | 293 "Process a request from the server to edit some files. |
294 PROC is the server process. Format of STRING is \"PATH PATH PATH... \\n\"." | |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
295 (server-log string proc) |
49686
64195811ff44
(server-previous-strings): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49267
diff
changeset
|
296 (let ((prev (process-get proc 'previous-string))) |
64195811ff44
(server-previous-strings): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49267
diff
changeset
|
297 (when prev |
64195811ff44
(server-previous-strings): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49267
diff
changeset
|
298 (setq string (concat prev string)) |
64195811ff44
(server-previous-strings): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49267
diff
changeset
|
299 (process-put proc 'previous-string nil))) |
10281
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
300 ;; If the input is multiple lines, |
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
301 ;; process each line individually. |
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
302 (while (string-match "\n" string) |
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
303 (let ((request (substring string 0 (match-beginning 0))) |
24474
3b77bf7b709e
(server-start): Set coding system for the server
Kenichi Handa <handa@m17n.org>
parents:
21941
diff
changeset
|
304 (coding-system (and default-enable-multibyte-characters |
3b77bf7b709e
(server-start): Set coding system for the server
Kenichi Handa <handa@m17n.org>
parents:
21941
diff
changeset
|
305 (or file-name-coding-system |
3b77bf7b709e
(server-start): Set coding system for the server
Kenichi Handa <handa@m17n.org>
parents:
21941
diff
changeset
|
306 default-file-name-coding-system))) |
47645
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
307 client nowait eval |
50 | 308 (files nil) |
38462
a7043adf8855
(server-visit-files): Handle the case the specified
Gerd Moellmann <gerd@gnu.org>
parents:
38412
diff
changeset
|
309 (lineno 1) |
54431
3e8ea09f9375
(server-process-filter): Delete temp frame.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54357
diff
changeset
|
310 (tmp-frame nil) ; Sometimes used to embody the selected display. |
38462
a7043adf8855
(server-visit-files): Handle the case the specified
Gerd Moellmann <gerd@gnu.org>
parents:
38412
diff
changeset
|
311 (columnno 0)) |
10281
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
312 ;; Remove this line from STRING. |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
313 (setq string (substring string (match-end 0))) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
314 (setq client (cons proc nil)) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
315 (while (string-match "[^ ]* " request) |
50567
1b32397dd4e2
(server-socket-name): Use new safe location for socket.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49686
diff
changeset
|
316 (let ((arg (substring request (match-beginning 0) (1- (match-end 0))))) |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
317 (setq request (substring request (match-end 0))) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
318 (cond |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
319 ((equal "-nowait" arg) (setq nowait t)) |
50567
1b32397dd4e2
(server-socket-name): Use new safe location for socket.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49686
diff
changeset
|
320 ((equal "-eval" arg) (setq eval t)) |
47645
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
321 ((and (equal "-display" arg) (string-match "\\([^ ]*\\) " request)) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
322 (let ((display (server-unquote-arg (match-string 1 request)))) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
323 (setq request (substring request (match-end 0))) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
324 (condition-case err |
54431
3e8ea09f9375
(server-process-filter): Delete temp frame.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54357
diff
changeset
|
325 (setq tmp-frame (server-select-display display)) |
47645
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
326 (error (process-send-string proc (nth 1 err)) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
327 (setq request ""))))) |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
328 ;; ARG is a line number option. |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
329 ((string-match "\\`\\+[0-9]+\\'" arg) |
62402
a7e02ef1e3d6
Replace `string-to-int' by `string-to-number'.
Juanma Barranquero <lekktu@gmail.com>
parents:
59996
diff
changeset
|
330 (setq lineno (string-to-number (substring arg 1)))) |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
331 ;; ARG is line number:column option. |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
332 ((string-match "\\`+\\([0-9]+\\):\\([0-9]+\\)\\'" arg) |
62402
a7e02ef1e3d6
Replace `string-to-int' by `string-to-number'.
Juanma Barranquero <lekktu@gmail.com>
parents:
59996
diff
changeset
|
333 (setq lineno (string-to-number (match-string 1 arg)) |
a7e02ef1e3d6
Replace `string-to-int' by `string-to-number'.
Juanma Barranquero <lekktu@gmail.com>
parents:
59996
diff
changeset
|
334 columnno (string-to-number (match-string 2 arg)))) |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
335 (t |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
336 ;; Undo the quoting that emacsclient does |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
337 ;; for certain special characters. |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
338 (setq arg (server-unquote-arg arg)) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
339 ;; Now decode the file name if necessary. |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
340 (if coding-system |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
341 (setq arg (decode-coding-string arg coding-system))) |
47645
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
342 (if eval |
69276
8c9110e3c96e
(server-process-filter): Handle errors during
Andreas Schwab <schwab@suse.de>
parents:
68651
diff
changeset
|
343 (let* (errorp |
8c9110e3c96e
(server-process-filter): Handle errors during
Andreas Schwab <schwab@suse.de>
parents:
68651
diff
changeset
|
344 (v (condition-case errobj |
8c9110e3c96e
(server-process-filter): Handle errors during
Andreas Schwab <schwab@suse.de>
parents:
68651
diff
changeset
|
345 (eval (car (read-from-string arg))) |
8c9110e3c96e
(server-process-filter): Handle errors during
Andreas Schwab <schwab@suse.de>
parents:
68651
diff
changeset
|
346 (error (setq errorp t) errobj)))) |
47645
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
347 (when v |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
348 (with-temp-buffer |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
349 (let ((standard-output (current-buffer))) |
69276
8c9110e3c96e
(server-process-filter): Handle errors during
Andreas Schwab <schwab@suse.de>
parents:
68651
diff
changeset
|
350 (if errorp (princ "error: ")) |
47645
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
351 (pp v) |
57379
ea05d398b4d7
(server-process-filter): Wrap `process-send-region'
Masatake YAMATO <jet@gyve.org>
parents:
54431
diff
changeset
|
352 ;; Suppress the error rose when the pipe to PROC is closed. |
ea05d398b4d7
(server-process-filter): Wrap `process-send-region'
Masatake YAMATO <jet@gyve.org>
parents:
54431
diff
changeset
|
353 (condition-case err |
ea05d398b4d7
(server-process-filter): Wrap `process-send-region'
Masatake YAMATO <jet@gyve.org>
parents:
54431
diff
changeset
|
354 (process-send-region proc (point-min) (point-max)) |
59220
2375d42b7362
* server.el (server-process-filter): Suppress `error', too.
Masatake YAMATO <jet@gyve.org>
parents:
57543
diff
changeset
|
355 (file-error nil) |
2375d42b7362
* server.el (server-process-filter): Suppress `error', too.
Masatake YAMATO <jet@gyve.org>
parents:
57543
diff
changeset
|
356 (error nil)) |
57379
ea05d398b4d7
(server-process-filter): Wrap `process-send-region'
Masatake YAMATO <jet@gyve.org>
parents:
54431
diff
changeset
|
357 )))) |
47645
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
358 ;; ARG is a file name. |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
359 ;; Collapse multiple slashes to single slashes. |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
360 (setq arg (command-line-normalize-file-name arg)) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
361 (push (list arg lineno columnno) files)) |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
362 (setq lineno 1) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
363 (setq columnno 0))))) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
364 (when files |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
365 (run-hooks 'pre-command-hook) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
366 (server-visit-files files client nowait) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
367 (run-hooks 'post-command-hook)) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
368 ;; CLIENT is now a list (CLIENTNUM BUFFERS...) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
369 (if (null (cdr client)) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
370 ;; This client is empty; get rid of it immediately. |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
371 (progn |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
372 (delete-process proc) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
373 (server-log "Close empty client" proc)) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
374 ;; We visited some buffer for this client. |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
375 (or nowait (push client server-clients)) |
49206
7ebd98bb02a2
(server-process-filter): Use `minibufferp' to test
John Paul Wallington <jpw@pobox.com>
parents:
49187
diff
changeset
|
376 (unless (or isearch-mode (minibufferp)) |
49187
c9f452e277ea
(server-process-filter): Comment out -eval.
Richard M. Stallman <rms@gnu.org>
parents:
48123
diff
changeset
|
377 (server-switch-buffer (nth 1 client)) |
c9f452e277ea
(server-process-filter): Comment out -eval.
Richard M. Stallman <rms@gnu.org>
parents:
48123
diff
changeset
|
378 (run-hooks 'server-switch-hook) |
c9f452e277ea
(server-process-filter): Comment out -eval.
Richard M. Stallman <rms@gnu.org>
parents:
48123
diff
changeset
|
379 (unless nowait |
65582
4d1085b02d64
Message format spec fixes (1)
Deepak Goel <deego@gnufans.org>
parents:
64762
diff
changeset
|
380 (message "%s" (substitute-command-keys |
54431
3e8ea09f9375
(server-process-filter): Delete temp frame.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
54357
diff
changeset
|
381 "When done with a buffer, type \\[server-edit]"))))) |
71650
dcb7e8b2f7b3
* server.el (server-select-display): Don't make the temp frame
Chong Yidong <cyd@stupidchicken.com>
parents:
71320
diff
changeset
|
382 ;; If the temporary frame is still the selected frame, make it |
dcb7e8b2f7b3
* server.el (server-select-display): Don't make the temp frame
Chong Yidong <cyd@stupidchicken.com>
parents:
71320
diff
changeset
|
383 ;; real. If not (which can happen if the user's customizations |
dcb7e8b2f7b3
* server.el (server-select-display): Don't make the temp frame
Chong Yidong <cyd@stupidchicken.com>
parents:
71320
diff
changeset
|
384 ;; call pop-to-buffer etc.), delete it to avoid preserving the |
dcb7e8b2f7b3
* server.el (server-select-display): Don't make the temp frame
Chong Yidong <cyd@stupidchicken.com>
parents:
71320
diff
changeset
|
385 ;; connection after the last real frame is deleted. |
dcb7e8b2f7b3
* server.el (server-select-display): Don't make the temp frame
Chong Yidong <cyd@stupidchicken.com>
parents:
71320
diff
changeset
|
386 (if tmp-frame |
dcb7e8b2f7b3
* server.el (server-select-display): Don't make the temp frame
Chong Yidong <cyd@stupidchicken.com>
parents:
71320
diff
changeset
|
387 (if (eq (selected-frame) tmp-frame) |
dcb7e8b2f7b3
* server.el (server-select-display): Don't make the temp frame
Chong Yidong <cyd@stupidchicken.com>
parents:
71320
diff
changeset
|
388 (set-frame-parameter tmp-frame 'visibility t) |
dcb7e8b2f7b3
* server.el (server-select-display): Don't make the temp frame
Chong Yidong <cyd@stupidchicken.com>
parents:
71320
diff
changeset
|
389 (delete-frame tmp-frame))))) |
10281
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
390 ;; Save for later any partial line that remains. |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
391 (when (> (length string) 0) |
49686
64195811ff44
(server-previous-strings): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49267
diff
changeset
|
392 (process-put proc 'previous-string string))) |
50 | 393 |
46907
ce6e92081932
(server-process-filter): Simplify code.
Richard M. Stallman <rms@gnu.org>
parents:
42140
diff
changeset
|
394 (defun server-goto-line-column (file-line-col) |
ce6e92081932
(server-process-filter): Simplify code.
Richard M. Stallman <rms@gnu.org>
parents:
42140
diff
changeset
|
395 (goto-line (nth 1 file-line-col)) |
ce6e92081932
(server-process-filter): Simplify code.
Richard M. Stallman <rms@gnu.org>
parents:
42140
diff
changeset
|
396 (let ((column-number (nth 2 file-line-col))) |
ce6e92081932
(server-process-filter): Simplify code.
Richard M. Stallman <rms@gnu.org>
parents:
42140
diff
changeset
|
397 (if (> column-number 0) |
ce6e92081932
(server-process-filter): Simplify code.
Richard M. Stallman <rms@gnu.org>
parents:
42140
diff
changeset
|
398 (move-to-column (1- column-number))))) |
ce6e92081932
(server-process-filter): Simplify code.
Richard M. Stallman <rms@gnu.org>
parents:
42140
diff
changeset
|
399 |
15956
0cefc98d243d
(server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents:
14717
diff
changeset
|
400 (defun server-visit-files (files client &optional nowait) |
47645
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
401 "Find FILES and return the list CLIENT with the buffers nconc'd. |
38462
a7043adf8855
(server-visit-files): Handle the case the specified
Gerd Moellmann <gerd@gnu.org>
parents:
38412
diff
changeset
|
402 FILES is an alist whose elements are (FILENAME LINENUMBER COLUMNNUMBER). |
15956
0cefc98d243d
(server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents:
14717
diff
changeset
|
403 NOWAIT non-nil means this client is not waiting for the results, |
0cefc98d243d
(server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents:
14717
diff
changeset
|
404 so don't mark these buffers specially, just visit them normally." |
7736
8c8410bc0f1b
(server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents:
7597
diff
changeset
|
405 ;; Bind last-nonmenu-event to force use of keyboard, not mouse, for queries. |
47645
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
406 (let ((last-nonmenu-event t) client-record) |
4500
56d7c4beae9f
(server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents:
4096
diff
changeset
|
407 ;; Restore the current buffer afterward, but not using save-excursion, |
56d7c4beae9f
(server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents:
4096
diff
changeset
|
408 ;; because we don't want to save point in this buffer |
56d7c4beae9f
(server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents:
4096
diff
changeset
|
409 ;; if it happens to be one of those specified by the server. |
47645
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
410 (save-current-buffer |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
411 (dolist (file files) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
412 ;; If there is an existing buffer modified or the file is |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
413 ;; modified, revert it. If there is an existing buffer with |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
414 ;; deleted file, offer to write it. |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
415 (let* ((filen (car file)) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
416 (obuf (get-file-buffer filen))) |
70420
718312081ce0
(server-visit-files): Use add-to-history.
Kim F. Storm <storm@cua.dk>
parents:
69276
diff
changeset
|
417 (add-to-history 'file-name-history filen) |
47645
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
418 (if (and obuf (set-buffer obuf)) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
419 (progn |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
420 (cond ((file-exists-p filen) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
421 (if (not (verify-visited-file-modtime obuf)) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
422 (revert-buffer t nil))) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
423 (t |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
424 (if (y-or-n-p |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
425 (concat "File no longer exists: " |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
426 filen |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
427 ", write buffer to file? ")) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
428 (write-file filen)))) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
429 (setq server-existing-buffer t) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
430 (server-goto-line-column file)) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
431 (set-buffer (find-file-noselect filen)) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
432 (server-goto-line-column file) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
433 (run-hooks 'server-visit-hook))) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
434 (unless nowait |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
435 ;; When the buffer is killed, inform the clients. |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
436 (add-hook 'kill-buffer-hook 'server-kill-buffer nil t) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
437 (push (car client) server-buffer-clients)) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
438 (push (current-buffer) client-record))) |
50 | 439 (nconc client client-record))) |
440 | |
17712
41a4624c1e79
(server-buffer-done): New arg FOR-KILLING.
Richard M. Stallman <rms@gnu.org>
parents:
17434
diff
changeset
|
441 (defun server-buffer-done (buffer &optional for-killing) |
50 | 442 "Mark BUFFER as \"done\" for its client(s). |
10961
88cba63f2a9b
(server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents:
10281
diff
changeset
|
443 This buries the buffer, then returns a list of the form (NEXT-BUFFER KILLED). |
88cba63f2a9b
(server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents:
10281
diff
changeset
|
444 NEXT-BUFFER is another server buffer, as a suggestion for what to select next, |
47517
8e9589a87f9b
(server-log): Add `client' arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46907
diff
changeset
|
445 or nil. KILLED is t if we killed BUFFER (typically, because it was visiting |
8e9589a87f9b
(server-log): Add `client' arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46907
diff
changeset
|
446 a temp file). |
8e9589a87f9b
(server-log): Add `client' arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46907
diff
changeset
|
447 FOR-KILLING if non-nil indicates that we are called from `kill-buffer'." |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
448 (let ((next-buffer nil) |
10961
88cba63f2a9b
(server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents:
10281
diff
changeset
|
449 (killed nil) |
50 | 450 (old-clients server-clients)) |
451 (while old-clients | |
452 (let ((client (car old-clients))) | |
47517
8e9589a87f9b
(server-log): Add `client' arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46907
diff
changeset
|
453 (or next-buffer |
50 | 454 (setq next-buffer (nth 1 (memq buffer client)))) |
455 (delq buffer client) | |
10281
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
456 ;; Delete all dead buffers from CLIENT. |
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
457 (let ((tail client)) |
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
458 (while tail |
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
459 (and (bufferp (car tail)) |
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
460 (null (buffer-name (car tail))) |
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
461 (delq (car tail) client)) |
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
462 (setq tail (cdr tail)))) |
50 | 463 ;; If client now has no pending buffers, |
464 ;; tell it that it is done, and forget it entirely. | |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
465 (unless (cdr client) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
466 (delete-process (car client)) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
467 (server-log "Close" (car client)) |
50 | 468 (setq server-clients (delq client server-clients)))) |
469 (setq old-clients (cdr old-clients))) | |
10281
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
470 (if (and (bufferp buffer) (buffer-name buffer)) |
21941
1baa3e876ad0
(server-buffer-done): Bind server-kill-buffer-running
Richard M. Stallman <rms@gnu.org>
parents:
19418
diff
changeset
|
471 ;; We may or may not kill this buffer; |
1baa3e876ad0
(server-buffer-done): Bind server-kill-buffer-running
Richard M. Stallman <rms@gnu.org>
parents:
19418
diff
changeset
|
472 ;; if we do, do not call server-buffer-done recursively |
1baa3e876ad0
(server-buffer-done): Bind server-kill-buffer-running
Richard M. Stallman <rms@gnu.org>
parents:
19418
diff
changeset
|
473 ;; from kill-buffer-hook. |
1baa3e876ad0
(server-buffer-done): Bind server-kill-buffer-running
Richard M. Stallman <rms@gnu.org>
parents:
19418
diff
changeset
|
474 (let ((server-kill-buffer-running t)) |
48123
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
475 (with-current-buffer buffer |
7597
99a600c67e82
(server-done-hook): New hook.
Richard M. Stallman <rms@gnu.org>
parents:
7553
diff
changeset
|
476 (setq server-buffer-clients nil) |
99a600c67e82
(server-done-hook): New hook.
Richard M. Stallman <rms@gnu.org>
parents:
7553
diff
changeset
|
477 (run-hooks 'server-done-hook)) |
21941
1baa3e876ad0
(server-buffer-done): Bind server-kill-buffer-running
Richard M. Stallman <rms@gnu.org>
parents:
19418
diff
changeset
|
478 ;; Notice whether server-done-hook killed the buffer. |
1baa3e876ad0
(server-buffer-done): Bind server-kill-buffer-running
Richard M. Stallman <rms@gnu.org>
parents:
19418
diff
changeset
|
479 (if (null (buffer-name buffer)) |
1baa3e876ad0
(server-buffer-done): Bind server-kill-buffer-running
Richard M. Stallman <rms@gnu.org>
parents:
19418
diff
changeset
|
480 (setq killed t) |
1baa3e876ad0
(server-buffer-done): Bind server-kill-buffer-running
Richard M. Stallman <rms@gnu.org>
parents:
19418
diff
changeset
|
481 ;; Don't bother killing or burying the buffer |
1baa3e876ad0
(server-buffer-done): Bind server-kill-buffer-running
Richard M. Stallman <rms@gnu.org>
parents:
19418
diff
changeset
|
482 ;; when we are called from kill-buffer. |
1baa3e876ad0
(server-buffer-done): Bind server-kill-buffer-running
Richard M. Stallman <rms@gnu.org>
parents:
19418
diff
changeset
|
483 (unless for-killing |
31008
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
484 (when (and (not killed) |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
485 server-kill-new-buffers |
40915
e26c1e76e1ca
(server-buffer-done): Test of server-existing-buffer was backwards.
Richard M. Stallman <rms@gnu.org>
parents:
39177
diff
changeset
|
486 (with-current-buffer buffer |
e26c1e76e1ca
(server-buffer-done): Test of server-existing-buffer was backwards.
Richard M. Stallman <rms@gnu.org>
parents:
39177
diff
changeset
|
487 (not server-existing-buffer))) |
31008
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
488 (setq killed t) |
34685
7218b9b8c2ad
(server-buffer-done): Bury the buffer before
Gerd Moellmann <gerd@gnu.org>
parents:
34344
diff
changeset
|
489 (bury-buffer buffer) |
31008
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
490 (kill-buffer buffer)) |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
491 (unless killed |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
492 (if (server-temp-file-p buffer) |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
493 (progn |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
494 (kill-buffer buffer) |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
495 (setq killed t)) |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
496 (bury-buffer buffer))))))) |
10961
88cba63f2a9b
(server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents:
10281
diff
changeset
|
497 (list next-buffer killed))) |
50 | 498 |
48123
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
499 (defun server-temp-file-p (&optional buffer) |
50 | 500 "Return non-nil if BUFFER contains a file considered temporary. |
501 These are files whose names suggest they are repeatedly | |
502 reused to pass information to another program. | |
503 | |
504 The variable `server-temp-file-regexp' controls which filenames | |
505 are considered temporary." | |
506 (and (buffer-file-name buffer) | |
507 (string-match server-temp-file-regexp (buffer-file-name buffer)))) | |
508 | |
509 (defun server-done () | |
1540 | 510 "Offer to save current buffer, mark it as \"done\" for clients. |
40972
cb428483fb22
(server-edit, server-done): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
40915
diff
changeset
|
511 This kills or buries the buffer, then returns a list |
cb428483fb22
(server-edit, server-done): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
40915
diff
changeset
|
512 of the form (NEXT-BUFFER KILLED). NEXT-BUFFER is another server buffer, |
cb428483fb22
(server-edit, server-done): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
40915
diff
changeset
|
513 as a suggestion for what to select next, or nil. |
cb428483fb22
(server-edit, server-done): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
40915
diff
changeset
|
514 KILLED is t if we killed BUFFER, which happens if it was created |
cb428483fb22
(server-edit, server-done): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
40915
diff
changeset
|
515 specifically for the clients and did not exist before their request for it." |
48123
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
516 (when server-buffer-clients |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
517 (if (server-temp-file-p) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
518 ;; For a temp file, save, and do make a non-numeric backup |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
519 ;; (unless make-backup-files is nil). |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
520 (let ((version-control nil) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
521 (buffer-backed-up nil)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
522 (save-buffer)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
523 (if (and (buffer-modified-p) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
524 buffer-file-name |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
525 (y-or-n-p (concat "Save file " buffer-file-name "? "))) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
526 (save-buffer))) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
527 (server-buffer-done (current-buffer)))) |
6176
1dbec303c87b
(kill-emacs-query-functions, kill-buffer-query-functions):
Richard M. Stallman <rms@gnu.org>
parents:
5749
diff
changeset
|
528 |
9883 | 529 ;; Ask before killing a server buffer. |
530 ;; It was suggested to release its client instead, | |
531 ;; but I think that is dangerous--the client would proceed | |
532 ;; using whatever is on disk in that file. -- rms. | |
6993
0983fe01e614
(server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents:
6960
diff
changeset
|
533 (defun server-kill-buffer-query-function () |
0983fe01e614
(server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents:
6960
diff
changeset
|
534 (or (not server-buffer-clients) |
0983fe01e614
(server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents:
6960
diff
changeset
|
535 (yes-or-no-p (format "Buffer `%s' still has clients; kill it? " |
0983fe01e614
(server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents:
6960
diff
changeset
|
536 (buffer-name (current-buffer)))))) |
0983fe01e614
(server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents:
6960
diff
changeset
|
537 |
6176
1dbec303c87b
(kill-emacs-query-functions, kill-buffer-query-functions):
Richard M. Stallman <rms@gnu.org>
parents:
5749
diff
changeset
|
538 (add-hook 'kill-buffer-query-functions |
6993
0983fe01e614
(server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents:
6960
diff
changeset
|
539 'server-kill-buffer-query-function) |
6176
1dbec303c87b
(kill-emacs-query-functions, kill-buffer-query-functions):
Richard M. Stallman <rms@gnu.org>
parents:
5749
diff
changeset
|
540 |
6993
0983fe01e614
(server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents:
6960
diff
changeset
|
541 (defun server-kill-emacs-query-function () |
7736
8c8410bc0f1b
(server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents:
7597
diff
changeset
|
542 (let (live-client |
8c8410bc0f1b
(server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents:
7597
diff
changeset
|
543 (tail server-clients)) |
8c8410bc0f1b
(server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents:
7597
diff
changeset
|
544 ;; See if any clients have any buffers that are still alive. |
8c8410bc0f1b
(server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents:
7597
diff
changeset
|
545 (while tail |
8c8410bc0f1b
(server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents:
7597
diff
changeset
|
546 (if (memq t (mapcar 'stringp (mapcar 'buffer-name (cdr (car tail))))) |
8c8410bc0f1b
(server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents:
7597
diff
changeset
|
547 (setq live-client t)) |
8c8410bc0f1b
(server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents:
7597
diff
changeset
|
548 (setq tail (cdr tail))) |
8c8410bc0f1b
(server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents:
7597
diff
changeset
|
549 (or (not live-client) |
8c8410bc0f1b
(server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents:
7597
diff
changeset
|
550 (yes-or-no-p "Server buffers still have clients; exit anyway? ")))) |
6993
0983fe01e614
(server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents:
6960
diff
changeset
|
551 |
0983fe01e614
(server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents:
6960
diff
changeset
|
552 (add-hook 'kill-emacs-query-functions 'server-kill-emacs-query-function) |
17712
41a4624c1e79
(server-buffer-done): New arg FOR-KILLING.
Richard M. Stallman <rms@gnu.org>
parents:
17434
diff
changeset
|
553 |
18049
f1fa9625e2b9
(server-kill-buffer): Prevent infinite recursion.
Richard M. Stallman <rms@gnu.org>
parents:
17970
diff
changeset
|
554 (defvar server-kill-buffer-running nil |
21941
1baa3e876ad0
(server-buffer-done): Bind server-kill-buffer-running
Richard M. Stallman <rms@gnu.org>
parents:
19418
diff
changeset
|
555 "Non-nil while `server-kill-buffer' or `server-buffer-done' is running.") |
18049
f1fa9625e2b9
(server-kill-buffer): Prevent infinite recursion.
Richard M. Stallman <rms@gnu.org>
parents:
17970
diff
changeset
|
556 |
17712
41a4624c1e79
(server-buffer-done): New arg FOR-KILLING.
Richard M. Stallman <rms@gnu.org>
parents:
17434
diff
changeset
|
557 (defun server-kill-buffer () |
18049
f1fa9625e2b9
(server-kill-buffer): Prevent infinite recursion.
Richard M. Stallman <rms@gnu.org>
parents:
17970
diff
changeset
|
558 ;; Prevent infinite recursion if user has made server-done-hook |
f1fa9625e2b9
(server-kill-buffer): Prevent infinite recursion.
Richard M. Stallman <rms@gnu.org>
parents:
17970
diff
changeset
|
559 ;; call kill-buffer. |
f1fa9625e2b9
(server-kill-buffer): Prevent infinite recursion.
Richard M. Stallman <rms@gnu.org>
parents:
17970
diff
changeset
|
560 (or server-kill-buffer-running |
21941
1baa3e876ad0
(server-buffer-done): Bind server-kill-buffer-running
Richard M. Stallman <rms@gnu.org>
parents:
19418
diff
changeset
|
561 (and server-buffer-clients |
1baa3e876ad0
(server-buffer-done): Bind server-kill-buffer-running
Richard M. Stallman <rms@gnu.org>
parents:
19418
diff
changeset
|
562 (let ((server-kill-buffer-running t)) |
1baa3e876ad0
(server-buffer-done): Bind server-kill-buffer-running
Richard M. Stallman <rms@gnu.org>
parents:
19418
diff
changeset
|
563 (when server-process |
1baa3e876ad0
(server-buffer-done): Bind server-kill-buffer-running
Richard M. Stallman <rms@gnu.org>
parents:
19418
diff
changeset
|
564 (server-buffer-done (current-buffer) t)))))) |
50 | 565 |
566 (defun server-edit (&optional arg) | |
567 "Switch to next server editing buffer; say \"Done\" for current buffer. | |
568 If a server buffer is current, it is marked \"done\" and optionally saved. | |
40972
cb428483fb22
(server-edit, server-done): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
40915
diff
changeset
|
569 The buffer is also killed if it did not exist before the clients asked for it. |
50 | 570 When all of a client's buffers are marked as \"done\", the client is notified. |
571 | |
572 Temporary files such as MH <draft> files are always saved and backed up, | |
4096
badd80e9e4fc
(server-done): Let save-buffer make the backup,
Richard M. Stallman <rms@gnu.org>
parents:
3746
diff
changeset
|
573 no questions asked. (The variable `make-backup-files', if nil, still |
badd80e9e4fc
(server-done): Let save-buffer make the backup,
Richard M. Stallman <rms@gnu.org>
parents:
3746
diff
changeset
|
574 inhibits a backup; you can set it locally in a particular buffer to |
badd80e9e4fc
(server-done): Let save-buffer make the backup,
Richard M. Stallman <rms@gnu.org>
parents:
3746
diff
changeset
|
575 prevent a backup for it.) The variable `server-temp-file-regexp' controls |
50 | 576 which filenames are considered temporary. |
577 | |
49206
7ebd98bb02a2
(server-process-filter): Use `minibufferp' to test
John Paul Wallington <jpw@pobox.com>
parents:
49187
diff
changeset
|
578 If invoked with a prefix argument, or if there is no server process running, |
50 | 579 starts server process and that is all. Invoked by \\[server-edit]." |
580 (interactive "P") | |
71320
59c8b05c2ce4
* server.el (server-edit): No-op if no server buffers exist.
Chong Yidong <cyd@stupidchicken.com>
parents:
70672
diff
changeset
|
581 (cond |
59c8b05c2ce4
* server.el (server-edit): No-op if no server buffers exist.
Chong Yidong <cyd@stupidchicken.com>
parents:
70672
diff
changeset
|
582 ((or arg |
59c8b05c2ce4
* server.el (server-edit): No-op if no server buffers exist.
Chong Yidong <cyd@stupidchicken.com>
parents:
70672
diff
changeset
|
583 (not server-process) |
59c8b05c2ce4
* server.el (server-edit): No-op if no server buffers exist.
Chong Yidong <cyd@stupidchicken.com>
parents:
70672
diff
changeset
|
584 (memq (process-status server-process) '(signal exit))) |
59c8b05c2ce4
* server.el (server-edit): No-op if no server buffers exist.
Chong Yidong <cyd@stupidchicken.com>
parents:
70672
diff
changeset
|
585 (server-mode 1)) |
59c8b05c2ce4
* server.el (server-edit): No-op if no server buffers exist.
Chong Yidong <cyd@stupidchicken.com>
parents:
70672
diff
changeset
|
586 (server-clients (apply 'server-switch-buffer (server-done))) |
59c8b05c2ce4
* server.el (server-edit): No-op if no server buffers exist.
Chong Yidong <cyd@stupidchicken.com>
parents:
70672
diff
changeset
|
587 (t (message "No server editing buffers exist")))) |
50 | 588 |
11329
ecbfde696360
(server-switch-buffer): Make first arg optional too;
Roland McGrath <roland@gnu.org>
parents:
11235
diff
changeset
|
589 (defun server-switch-buffer (&optional next-buffer killed-one) |
50 | 590 "Switch to another buffer, preferably one that has a client. |
591 Arg NEXT-BUFFER is a suggestion; if it is a live buffer, use it." | |
10961
88cba63f2a9b
(server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents:
10281
diff
changeset
|
592 ;; KILLED-ONE is t in a recursive call |
88cba63f2a9b
(server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents:
10281
diff
changeset
|
593 ;; if we have already killed one temp-file server buffer. |
88cba63f2a9b
(server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents:
10281
diff
changeset
|
594 ;; This means we should avoid the final "switch to some other buffer" |
88cba63f2a9b
(server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents:
10281
diff
changeset
|
595 ;; since we've already effectively done that. |
47524
95ba2ac51138
(server-done): Fix harmlessly wrong arg to save-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47517
diff
changeset
|
596 (if (null next-buffer) |
95ba2ac51138
(server-done): Fix harmlessly wrong arg to save-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47517
diff
changeset
|
597 (if server-clients |
95ba2ac51138
(server-done): Fix harmlessly wrong arg to save-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47517
diff
changeset
|
598 (server-switch-buffer (nth 1 (car server-clients)) killed-one) |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
599 (unless (or killed-one (window-dedicated-p (selected-window))) |
48069
518adc9496ed
(server-switch-buffer): Say when no server buffers remain.
Richard M. Stallman <rms@gnu.org>
parents:
47658
diff
changeset
|
600 (switch-to-buffer (other-buffer)) |
518adc9496ed
(server-switch-buffer): Say when no server buffers remain.
Richard M. Stallman <rms@gnu.org>
parents:
47658
diff
changeset
|
601 (message "No server buffers remain to edit"))) |
47524
95ba2ac51138
(server-done): Fix harmlessly wrong arg to save-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47517
diff
changeset
|
602 (if (not (buffer-name next-buffer)) |
95ba2ac51138
(server-done): Fix harmlessly wrong arg to save-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47517
diff
changeset
|
603 ;; If NEXT-BUFFER is a dead buffer, remove the server records for it |
50 | 604 ;; and try the next surviving server buffer. |
47524
95ba2ac51138
(server-done): Fix harmlessly wrong arg to save-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47517
diff
changeset
|
605 (apply 'server-switch-buffer (server-buffer-done next-buffer)) |
95ba2ac51138
(server-done): Fix harmlessly wrong arg to save-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47517
diff
changeset
|
606 ;; OK, we know next-buffer is live, let's display and select it. |
48123
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
607 (if (functionp server-window) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
608 (funcall server-window next-buffer) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
609 (let ((win (get-buffer-window next-buffer 0))) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
610 (if (and win (not server-window)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
611 ;; The buffer is already displayed: just reuse the window. |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
612 (let ((frame (window-frame win))) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
613 (if (eq (frame-visible-p frame) 'icon) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
614 (raise-frame frame)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
615 (select-window win) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
616 (set-buffer next-buffer)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
617 ;; Otherwise, let's find an appropriate window. |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
618 (cond ((and (windowp server-window) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
619 (window-live-p server-window)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
620 (select-window server-window)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
621 ((framep server-window) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
622 (if (not (frame-live-p server-window)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
623 (setq server-window (make-frame))) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
624 (select-window (frame-selected-window server-window)))) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
625 (if (window-minibuffer-p (selected-window)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
626 (select-window (next-window nil 'nomini 0))) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
627 ;; Move to a non-dedicated window, if we have one. |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
628 (when (window-dedicated-p (selected-window)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
629 (select-window |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
630 (get-window-with-predicate |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
631 (lambda (w) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
632 (and (not (window-dedicated-p w)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
633 (equal (frame-parameter (window-frame w) 'display) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
634 (frame-parameter (selected-frame) 'display)))) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
635 'nomini 'visible (selected-window)))) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
636 (condition-case nil |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
637 (switch-to-buffer next-buffer) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
638 ;; After all the above, we might still have ended up with |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
639 ;; a minibuffer/dedicated-window (if there's no other). |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
640 (error (pop-to-buffer next-buffer))))))))) |
50 | 641 |
64372
5cedf2e32893
Bind "C-x #" in a way that works even if C-x is redefined to a command key,
Eli Zaretskii <eliz@gnu.org>
parents:
64091
diff
changeset
|
642 (define-key ctl-x-map "#" 'server-edit) |
42140
49087a9d073e
(server-unload-hook): New function.
Dave Love <fx@gnu.org>
parents:
41075
diff
changeset
|
643 |
49087a9d073e
(server-unload-hook): New function.
Dave Love <fx@gnu.org>
parents:
41075
diff
changeset
|
644 (defun server-unload-hook () |
70672
06de67179ba1
(server-start): Only create a directory if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
70420
diff
changeset
|
645 (server-mode -1) |
42140
49087a9d073e
(server-unload-hook): New function.
Dave Love <fx@gnu.org>
parents:
41075
diff
changeset
|
646 (remove-hook 'kill-buffer-query-functions 'server-kill-buffer-query-function) |
49087a9d073e
(server-unload-hook): New function.
Dave Love <fx@gnu.org>
parents:
41075
diff
changeset
|
647 (remove-hook 'kill-emacs-query-functions 'server-kill-emacs-query-function) |
49087a9d073e
(server-unload-hook): New function.
Dave Love <fx@gnu.org>
parents:
41075
diff
changeset
|
648 (remove-hook 'kill-buffer-hook 'server-kill-buffer)) |
57543
e47852bd4fc4
(server-unload-hook): Set as a variable with add-hook.
Richard M. Stallman <rms@gnu.org>
parents:
57379
diff
changeset
|
649 |
70672
06de67179ba1
(server-start): Only create a directory if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
70420
diff
changeset
|
650 (add-hook 'kill-emacs-hook (lambda () (server-mode -1))) ;Cleanup upon exit. |
57543
e47852bd4fc4
(server-unload-hook): Set as a variable with add-hook.
Richard M. Stallman <rms@gnu.org>
parents:
57379
diff
changeset
|
651 (add-hook 'server-unload-hook 'server-unload-hook) |
1079 | 652 |
653 (provide 'server) | |
658
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
445
diff
changeset
|
654 |
70672
06de67179ba1
(server-start): Only create a directory if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
70420
diff
changeset
|
655 ;; arch-tag: 1f7ecb42-f00a-49f8-906d-61995d84c8d6 |
658
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
445
diff
changeset
|
656 ;;; server.el ends here |