Mercurial > emacs
annotate lisp/server.el @ 73758:c47396e80085
(hexl-mode): Fix typo in docstring.
author | Juanma Barranquero <lekktu@gmail.com> |
---|---|
date | Mon, 06 Nov 2006 02:45:49 +0000 |
parents | df25a33a90b0 |
children | 6bca57b7534e |
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 |
73559
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
85 (defcustom server-use-tcp nil |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
86 "If non-nil, use TCP sockets instead of local sockets." |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
87 :set #'(lambda (sym val) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
88 (unless (featurep 'make-network-process '(:family local)) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
89 (setq val t) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
90 (unless load-in-progress |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
91 (message "Local sockets unsupported, using TCP sockets"))) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
92 (when val (random t)) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
93 (set-default sym val)) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
94 :group 'server |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
95 :type 'boolean |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
96 :version "22.1") |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
97 |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
98 (defcustom server-host nil |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
99 "The name or IP address to use as host address of the server process. |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
100 If set, the server accepts remote connections; otherwise it is local." |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
101 :group 'server |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
102 :type '(choice |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
103 (string :tag "Name or IP address") |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
104 (const :tag "Local" nil)) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
105 :version "22.1") |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
106 (put 'server-host 'risky-local-variable t) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
107 |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
108 (defcustom server-auth-dir "~/.emacs.d/server/" |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
109 "Directory for server authentication files." |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
110 :group 'server |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
111 :type 'directory |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
112 :version "22.1") |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
113 (put 'server-auth-dir 'risky-local-variable t) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
114 |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
115 (defcustom server-visit-hook nil |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
116 "*Hook run when visiting a file for the Emacs server." |
19418 | 117 :group 'server |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
118 :type 'hook) |
50 | 119 |
19418 | 120 (defcustom server-switch-hook nil |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
121 "*Hook run when switching to a buffer for the Emacs server." |
19418 | 122 :group 'server |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
123 :type 'hook) |
19418 | 124 |
125 (defcustom server-done-hook nil | |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
126 "*Hook run when done editing a buffer for the Emacs server." |
19418 | 127 :group 'server |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
128 :type 'hook) |
7597
99a600c67e82
(server-done-hook): New hook.
Richard M. Stallman <rms@gnu.org>
parents:
7553
diff
changeset
|
129 |
49206
7ebd98bb02a2
(server-process-filter): Use `minibufferp' to test
John Paul Wallington <jpw@pobox.com>
parents:
49187
diff
changeset
|
130 (defvar server-process nil |
7ebd98bb02a2
(server-process-filter): Use `minibufferp' to test
John Paul Wallington <jpw@pobox.com>
parents:
49187
diff
changeset
|
131 "The current server process.") |
50 | 132 |
133 (defvar server-clients nil | |
134 "List of current server clients. | |
7736
8c8410bc0f1b
(server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents:
7597
diff
changeset
|
135 Each element is (CLIENTID BUFFERS...) where CLIENTID is a string |
50 | 136 that can be given to the server process to identify a client. |
137 When a buffer is marked as \"done\", it is removed from this list.") | |
138 | |
139 (defvar server-buffer-clients nil | |
38010
8a8cf4d74475
(server-process, server-buffer-clients): Doc fix.
Eli Zaretskii <eliz@gnu.org>
parents:
37273
diff
changeset
|
140 "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
|
141 (make-variable-buffer-local 'server-buffer-clients) |
50 | 142 ;; Changing major modes should not erase this local. |
143 (put 'server-buffer-clients 'permanent-local t) | |
144 | |
49267 | 145 (defcustom server-window nil |
146 "*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
|
147 If nil, use the selected window. |
49267 | 148 If it is a function, it should take one argument (a buffer) and |
149 display and select it. A common value is `pop-to-buffer'. | |
150 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
|
151 If it is a frame, use the frame's selected window. |
49267 | 152 |
153 It is not meaningful to set this to a specific frame or window with Custom. | |
154 Only programs can do so." | |
155 :group 'server | |
59996
aac0a33f5772
Change release version from 21.4 to 22.1 throughout.
Kim F. Storm <storm@cua.dk>
parents:
59220
diff
changeset
|
156 :version "22.1" |
49267 | 157 :type '(choice (const :tag "Use selected window" |
158 :match (lambda (widget value) | |
159 (not (functionp value))) | |
160 nil) | |
161 (function-item :tag "Use pop-to-buffer" pop-to-buffer) | |
162 (function :tag "Other function"))) | |
3661
65d530f613a8
(server-window): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
2866
diff
changeset
|
163 |
19418 | 164 (defcustom server-temp-file-regexp "^/tmp/Re\\|/draft$" |
49267 | 165 "*Regexp matching names of temporary files. |
166 These are deleted and reused after each edit by the programs that | |
167 invoke the Emacs server." | |
19418 | 168 :group 'server |
169 :type 'regexp) | |
50 | 170 |
31008
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
171 (defcustom server-kill-new-buffers t |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
172 "*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
|
173 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
|
174 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
|
175 `server-temp-file-regexp'. |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
176 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
|
177 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
|
178 this way." |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
179 :group 'server |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
180 :type 'boolean |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
181 :version "21.1") |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
182 |
50 | 183 (or (assq 'server-buffer-clients minor-mode-alist) |
73604
3b0b74acfa45
Try and fit within 80 columns.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73559
diff
changeset
|
184 (push '(server-buffer-clients " Server") minor-mode-alist)) |
50 | 185 |
31008
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
186 (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
|
187 "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
|
188 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
|
189 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
|
190 (make-variable-buffer-local 'server-existing-buffer) |
ac8beefc28a9
(server-kill-new-buffers): New user option.
Gerd Moellmann <gerd@gnu.org>
parents:
30004
diff
changeset
|
191 |
54357
367f0279478f
(server-name): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53736
diff
changeset
|
192 (defvar server-name "server") |
367f0279478f
(server-name): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53736
diff
changeset
|
193 |
367f0279478f
(server-name): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53736
diff
changeset
|
194 (defvar server-socket-dir |
367f0279478f
(server-name): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53736
diff
changeset
|
195 (format "/tmp/emacs%d" (user-uid))) |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
196 |
47517
8e9589a87f9b
(server-log): Add `client' arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46907
diff
changeset
|
197 (defun server-log (string &optional client) |
49267 | 198 "If a *server* buffer exists, write STRING to it for logging purposes." |
73559
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
199 (when (get-buffer "*server*") |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
200 (with-current-buffer "*server*" |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
201 (goto-char (point-max)) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
202 (insert (current-time-string) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
203 (if client (format " %s:" client) " ") |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
204 string) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
205 (or (bolp) (newline))))) |
50 | 206 |
207 (defun server-sentinel (proc msg) | |
48123
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
208 (let ((client (assq proc server-clients))) |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
209 ;; 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
|
210 (when client |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
211 (setq server-clients (delq client server-clients)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
212 (dolist (buf (cdr client)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
213 (with-current-buffer buf |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
214 ;; 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
|
215 (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
|
216 ;; Kill the buffer if necessary. |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
217 (when (and (null server-buffer-clients) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
218 (or (and server-kill-new-buffers |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
219 (not server-existing-buffer)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
220 (server-temp-file-p))) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
221 (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
|
222 ;; 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
|
223 ;; 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
|
224 (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
|
225 (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
|
226 (set-process-query-on-exit-flag proc nil)) |
73628
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
227 ;; Delete the associated connection file, if applicable. |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
228 ;; This is actually problematic: the file may have been overwritten by |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
229 ;; another Emacs server in the mean time, so it's not ours any more. |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
230 ;; (and (process-contact proc :server) |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
231 ;; (eq (process-status proc) 'closed) |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
232 ;; (ignore-errors (delete-file (process-get proc :server-file)))) |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
233 (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
|
234 |
47645
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
235 (defun server-select-display (display) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
236 ;; 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
|
237 (unless (equal (frame-parameter (selected-frame) 'display) display) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
238 ;; 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
|
239 (dolist (frame (frame-list)) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
240 (when (equal (frame-parameter frame 'display) display) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
241 (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
|
242 ;; 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
|
243 (unless (equal (frame-parameter (selected-frame) 'display) display) |
73543
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
244 (let* ((buffer (generate-new-buffer " *server-dummy*")) |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
245 (frame (make-frame-on-display |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
246 display |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
247 ;; Make it display (and remember) some dummy buffer, so |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
248 ;; we can detect later if the frame is in use or not. |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
249 `((server-dummmy-buffer . ,buffer) |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
250 ;; This frame may be deleted later (see |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
251 ;; server-unselect-display) so we want it to be as |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
252 ;; unobtrusive as possible. |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
253 (visibility . nil))))) |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
254 (select-frame frame) |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
255 (set-window-buffer (selected-window) buffer))))) |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
256 |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
257 (defun server-unselect-display (frame) |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
258 ;; If the temporary frame is in use (displays something real), make it |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
259 ;; visible. If not (which can happen if the user's customizations call |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
260 ;; pop-to-buffer etc.), delete it to avoid preserving the connection after |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
261 ;; the last real frame is deleted. |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
262 (if (and (eq (frame-first-window frame) |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
263 (next-window (frame-first-window frame) 'nomini)) |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
264 (eq (window-buffer (frame-first-window frame)) |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
265 (frame-parameter frame 'server-dummy-buffer))) |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
266 ;; The temp frame still only shows one buffer, and that is the |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
267 ;; internal temp buffer. |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
268 (delete-frame frame) |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
269 (set-frame-parameter frame 'visibility t)) |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
270 (kill-buffer (frame-parameter frame 'server-dummy-buffer)) |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
271 (set-frame-parameter frame 'server-dummy-buffer nil)) |
47645
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
272 |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
273 (defun server-unquote-arg (arg) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
274 (replace-regexp-in-string |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
275 "&." (lambda (s) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
276 (case (aref s 1) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
277 (?& "&") |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
278 (?- "-") |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
279 (?n "\n") |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
280 (t " "))) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
281 arg t t)) |
50 | 282 |
50567
1b32397dd4e2
(server-socket-name): Use new safe location for socket.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49686
diff
changeset
|
283 (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
|
284 "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
|
285 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
|
286 - 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
|
287 - 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
|
288 - 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
|
289 (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
|
290 (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
|
291 (unless attrs |
73559
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
292 (letf (((default-file-modes) ?\700)) (make-directory dir t)) |
50567
1b32397dd4e2
(server-socket-name): Use new safe location for socket.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49686
diff
changeset
|
293 (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
|
294 ;; 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
|
295 (unless (and (eq t (car attrs)) (eq (nth 2 attrs) (user-uid)) |
73559
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
296 (or (eq system-type 'windows-nt) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
297 (zerop (logand ?\077 (file-modes dir))))) |
50567
1b32397dd4e2
(server-socket-name): Use new safe location for socket.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49686
diff
changeset
|
298 (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
|
299 |
256 | 300 ;;;###autoload |
50 | 301 (defun server-start (&optional leave-dead) |
302 "Allow this Emacs process to be a server for client processes. | |
303 This starts a server communications subprocess through which | |
304 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
|
305 To use the server, set up the program `emacsclient' in the |
50 | 306 Emacs distribution as your standard \"editor\". |
307 | |
308 Prefix arg means just kill any existing server communications subprocess." | |
309 (interactive "P") | |
73559
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
310 (when server-process |
73604
3b0b74acfa45
Try and fit within 80 columns.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73559
diff
changeset
|
311 ;; kill it dead! |
73628
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
312 (ignore-errors (delete-process server-process))) |
16789
85b1a10101ff
(server-start): Don't delete ~/.emacs-server.
Richard M. Stallman <rms@gnu.org>
parents:
16075
diff
changeset
|
313 ;; If this Emacs already had a server, clear out associated status. |
50 | 314 (while server-clients |
315 (let ((buffer (nth 1 (car server-clients)))) | |
316 (server-buffer-done buffer))) | |
70672
06de67179ba1
(server-start): Only create a directory if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
70420
diff
changeset
|
317 ;; Now any previous server is properly stopped. |
47517
8e9589a87f9b
(server-log): Add `client' arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46907
diff
changeset
|
318 (unless leave-dead |
73628
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
319 (let* ((server-dir (if server-use-tcp server-auth-dir server-socket-dir)) |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
320 (server-file (expand-file-name server-name server-dir))) |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
321 ;; Make sure there is a safe directory in which to place the socket. |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
322 (server-ensure-safe-dir server-dir) |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
323 ;; Remove any leftover socket or authentication file. |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
324 (ignore-errors (delete-file server-file)) |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
325 (when server-process |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
326 (server-log (message "Restarting server"))) |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
327 (letf (((default-file-modes) ?\700)) |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
328 (setq server-process |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
329 (apply #'make-network-process |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
330 :name server-name |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
331 :server t |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
332 :noquery t |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
333 :sentinel 'server-sentinel |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
334 :filter 'server-process-filter |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
335 ;; We must receive file names without being decoded. |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
336 ;; Those are decoded by server-process-filter according |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
337 ;; to file-name-coding-system. |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
338 :coding 'raw-text |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
339 ;; The rest of the args depends on the kind of socket used. |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
340 (if server-use-tcp |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
341 (list :family nil |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
342 :service t |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
343 :host (or server-host 'local) |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
344 :plist '(:authenticated nil)) |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
345 (list :family 'local |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
346 :service server-file |
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
347 :plist '(:authenticated t))))) |
73629
df25a33a90b0
*** empty log message ***
Juanma Barranquero <lekktu@gmail.com>
parents:
73628
diff
changeset
|
348 (unless server-process (error "Could not start server process")) |
df25a33a90b0
*** empty log message ***
Juanma Barranquero <lekktu@gmail.com>
parents:
73628
diff
changeset
|
349 (when server-use-tcp |
df25a33a90b0
*** empty log message ***
Juanma Barranquero <lekktu@gmail.com>
parents:
73628
diff
changeset
|
350 (let ((auth-key |
df25a33a90b0
*** empty log message ***
Juanma Barranquero <lekktu@gmail.com>
parents:
73628
diff
changeset
|
351 (loop |
df25a33a90b0
*** empty log message ***
Juanma Barranquero <lekktu@gmail.com>
parents:
73628
diff
changeset
|
352 ;; The auth key is a 64-byte string of random chars in the |
df25a33a90b0
*** empty log message ***
Juanma Barranquero <lekktu@gmail.com>
parents:
73628
diff
changeset
|
353 ;; range `!'..`~'. |
df25a33a90b0
*** empty log message ***
Juanma Barranquero <lekktu@gmail.com>
parents:
73628
diff
changeset
|
354 for i below 64 |
df25a33a90b0
*** empty log message ***
Juanma Barranquero <lekktu@gmail.com>
parents:
73628
diff
changeset
|
355 collect (+ 33 (random 94)) into auth |
df25a33a90b0
*** empty log message ***
Juanma Barranquero <lekktu@gmail.com>
parents:
73628
diff
changeset
|
356 finally return (concat auth)))) |
df25a33a90b0
*** empty log message ***
Juanma Barranquero <lekktu@gmail.com>
parents:
73628
diff
changeset
|
357 (process-put server-process :auth-key auth-key) |
df25a33a90b0
*** empty log message ***
Juanma Barranquero <lekktu@gmail.com>
parents:
73628
diff
changeset
|
358 (with-temp-file server-file |
df25a33a90b0
*** empty log message ***
Juanma Barranquero <lekktu@gmail.com>
parents:
73628
diff
changeset
|
359 (set-buffer-multibyte nil) |
df25a33a90b0
*** empty log message ***
Juanma Barranquero <lekktu@gmail.com>
parents:
73628
diff
changeset
|
360 (setq buffer-file-coding-system 'no-conversion) |
df25a33a90b0
*** empty log message ***
Juanma Barranquero <lekktu@gmail.com>
parents:
73628
diff
changeset
|
361 (insert (format-network-address |
df25a33a90b0
*** empty log message ***
Juanma Barranquero <lekktu@gmail.com>
parents:
73628
diff
changeset
|
362 (process-contact server-process :local)) |
df25a33a90b0
*** empty log message ***
Juanma Barranquero <lekktu@gmail.com>
parents:
73628
diff
changeset
|
363 "\n" auth-key)))))))) |
49267 | 364 |
365 ;;;###autoload | |
366 (define-minor-mode server-mode | |
367 "Toggle Server mode. | |
368 With ARG, turn Server mode on if ARG is positive, off otherwise. | |
369 Server mode runs a process that accepts commands from the | |
370 `emacsclient' program. See `server-start' and Info node `Emacs server'." | |
371 :global t | |
372 :group 'server | |
59996
aac0a33f5772
Change release version from 21.4 to 22.1 throughout.
Kim F. Storm <storm@cua.dk>
parents:
59220
diff
changeset
|
373 :version "22.1" |
49267 | 374 ;; Fixme: Should this check for an existing server socket and do |
375 ;; nothing if there is one (for multiple Emacs sessions)? | |
376 (server-start (not server-mode))) | |
50 | 377 |
73559
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
378 (defun* server-process-filter (proc string) |
49267 | 379 "Process a request from the server to edit some files. |
380 PROC is the server process. Format of STRING is \"PATH PATH PATH... \\n\"." | |
73559
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
381 ;; First things first: let's check the authentication |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
382 (unless (process-get proc :authenticated) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
383 (if (and (string-match "-auth \\(.*?\\)\n" string) |
73628
97c917d6101a
(server-auth-key): Remove. Replace by a process-property.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
73611
diff
changeset
|
384 (equal (match-string 1 string) (process-get proc :auth-key))) |
73559
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
385 (progn |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
386 (setq string (substring string (match-end 0))) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
387 (process-put proc :authenticated t) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
388 (server-log "Authentication successful" proc)) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
389 (server-log "Authentication failed" proc) |
73611
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
390 (process-send-string proc "Authentication failed") |
73559
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
391 (delete-process proc) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
392 ;; We return immediately |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
393 (return-from server-process-filter))) |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
394 (server-log string proc) |
73559
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
395 (let ((prev (process-get proc :previous-string))) |
49686
64195811ff44
(server-previous-strings): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49267
diff
changeset
|
396 (when prev |
64195811ff44
(server-previous-strings): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49267
diff
changeset
|
397 (setq string (concat prev string)) |
73559
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
398 (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
|
399 ;; If the input is multiple lines, |
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
400 ;; process each line individually. |
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
401 (while (string-match "\n" string) |
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
402 (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
|
403 (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
|
404 (or file-name-coding-system |
3b77bf7b709e
(server-start): Set coding system for the server
Kenichi Handa <handa@m17n.org>
parents:
21941
diff
changeset
|
405 default-file-name-coding-system))) |
47645
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
406 client nowait eval |
50 | 407 (files nil) |
38462
a7043adf8855
(server-visit-files): Handle the case the specified
Gerd Moellmann <gerd@gnu.org>
parents:
38412
diff
changeset
|
408 (lineno 1) |
73559
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
409 (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
|
410 (columnno 0)) |
10281
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
411 ;; Remove this line from STRING. |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
412 (setq string (substring string (match-end 0))) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
413 (setq client (cons proc nil)) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
414 (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
|
415 (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
|
416 (setq request (substring request (match-end 0))) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
417 (cond |
73611
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
418 ((equal "-nowait" arg) (setq nowait t)) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
419 ((equal "-eval" arg) (setq eval t)) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
420 ((and (equal "-display" arg) (string-match "\\([^ ]*\\) " request)) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
421 (let ((display (server-unquote-arg (match-string 1 request)))) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
422 (setq request (substring request (match-end 0))) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
423 (condition-case err |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
424 (setq tmp-frame (server-select-display display)) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
425 (error (process-send-string proc (nth 1 err)) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
426 (setq request ""))))) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
427 ;; ARG is a line number option. |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
428 ((string-match "\\`\\+[0-9]+\\'" arg) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
429 (setq lineno (string-to-number (substring arg 1)))) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
430 ;; ARG is line number:column option. |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
431 ((string-match "\\`+\\([0-9]+\\):\\([0-9]+\\)\\'" arg) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
432 (setq lineno (string-to-number (match-string 1 arg)) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
433 columnno (string-to-number (match-string 2 arg)))) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
434 (t |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
435 ;; Undo the quoting that emacsclient does |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
436 ;; for certain special characters. |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
437 (setq arg (server-unquote-arg arg)) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
438 ;; Now decode the file name if necessary. |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
439 (when coding-system |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
440 (setq arg (decode-coding-string arg coding-system))) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
441 (if eval |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
442 (let* (errorp |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
443 (v (condition-case errobj |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
444 (eval (car (read-from-string arg))) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
445 (error (setq errorp t) errobj)))) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
446 (when v |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
447 (with-temp-buffer |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
448 (let ((standard-output (current-buffer))) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
449 (when errorp (princ "error: ")) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
450 (pp v) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
451 (ignore-errors |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
452 (process-send-region proc (point-min) (point-max))) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
453 )))) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
454 ;; ARG is a file name. |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
455 ;; Collapse multiple slashes to single slashes. |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
456 (setq arg (command-line-normalize-file-name arg)) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
457 (push (list arg lineno columnno) files)) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
458 (setq lineno 1) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
459 (setq columnno 0))))) |
47612
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
460 (when files |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
461 (run-hooks 'pre-command-hook) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
462 (server-visit-files files client nowait) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
463 (run-hooks 'post-command-hook)) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
464 ;; CLIENT is now a list (CLIENTNUM BUFFERS...) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
465 (if (null (cdr client)) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
466 ;; 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
|
467 (progn |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
468 (delete-process proc) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
469 (server-log "Close empty client" proc)) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
470 ;; We visited some buffer for this client. |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
471 (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
|
472 (unless (or isearch-mode (minibufferp)) |
49187
c9f452e277ea
(server-process-filter): Comment out -eval.
Richard M. Stallman <rms@gnu.org>
parents:
48123
diff
changeset
|
473 (server-switch-buffer (nth 1 client)) |
c9f452e277ea
(server-process-filter): Comment out -eval.
Richard M. Stallman <rms@gnu.org>
parents:
48123
diff
changeset
|
474 (run-hooks 'server-switch-hook) |
c9f452e277ea
(server-process-filter): Comment out -eval.
Richard M. Stallman <rms@gnu.org>
parents:
48123
diff
changeset
|
475 (unless nowait |
65582
4d1085b02d64
Message format spec fixes (1)
Deepak Goel <deego@gnufans.org>
parents:
64762
diff
changeset
|
476 (message "%s" (substitute-command-keys |
73611
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
477 "When done with a buffer, type \\[server-edit]"))))) |
73543
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
478 (when (frame-live-p tmp-frame) |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
479 ;; Delete tmp-frame or make it visible depending on whether it's |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
480 ;; been used or not. |
fa022f5f8164
(server-select-display): Use a dummy buffer to detect when
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71650
diff
changeset
|
481 (server-unselect-display tmp-frame)))) |
10281
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
482 ;; 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
|
483 (when (> (length string) 0) |
73559
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
484 (process-put proc :previous-string string))) |
50 | 485 |
46907
ce6e92081932
(server-process-filter): Simplify code.
Richard M. Stallman <rms@gnu.org>
parents:
42140
diff
changeset
|
486 (defun server-goto-line-column (file-line-col) |
ce6e92081932
(server-process-filter): Simplify code.
Richard M. Stallman <rms@gnu.org>
parents:
42140
diff
changeset
|
487 (goto-line (nth 1 file-line-col)) |
ce6e92081932
(server-process-filter): Simplify code.
Richard M. Stallman <rms@gnu.org>
parents:
42140
diff
changeset
|
488 (let ((column-number (nth 2 file-line-col))) |
73559
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
489 (when (> column-number 0) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
490 (move-to-column (1- column-number))))) |
46907
ce6e92081932
(server-process-filter): Simplify code.
Richard M. Stallman <rms@gnu.org>
parents:
42140
diff
changeset
|
491 |
15956
0cefc98d243d
(server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents:
14717
diff
changeset
|
492 (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
|
493 "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
|
494 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
|
495 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
|
496 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
|
497 ;; 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
|
498 (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
|
499 ;; 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
|
500 ;; 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
|
501 ;; 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
|
502 (save-current-buffer |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
503 (dolist (file files) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
504 ;; 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
|
505 ;; 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
|
506 ;; deleted file, offer to write it. |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
507 (let* ((filen (car file)) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
508 (obuf (get-file-buffer filen))) |
70420
718312081ce0
(server-visit-files): Use add-to-history.
Kim F. Storm <storm@cua.dk>
parents:
69276
diff
changeset
|
509 (add-to-history 'file-name-history filen) |
47645
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
510 (if (and obuf (set-buffer obuf)) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
511 (progn |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
512 (cond ((file-exists-p filen) |
73611
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
513 (when (not (verify-visited-file-modtime obuf)) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
514 (revert-buffer t nil))) |
47645
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
515 (t |
73611
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
516 (when (y-or-n-p |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
517 (concat "File no longer exists: " |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
518 filen |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
519 ", write buffer to file? ")) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
520 (write-file filen)))) |
47645
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
521 (setq server-existing-buffer t) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
522 (server-goto-line-column file)) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
523 (set-buffer (find-file-noselect filen)) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
524 (server-goto-line-column file) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
525 (run-hooks 'server-visit-hook))) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
526 (unless nowait |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
527 ;; When the buffer is killed, inform the clients. |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
528 (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
|
529 (push (car client) server-buffer-clients)) |
d033b85fc797
(server-select-display): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47612
diff
changeset
|
530 (push (current-buffer) client-record))) |
50 | 531 (nconc client client-record))) |
532 | |
17712
41a4624c1e79
(server-buffer-done): New arg FOR-KILLING.
Richard M. Stallman <rms@gnu.org>
parents:
17434
diff
changeset
|
533 (defun server-buffer-done (buffer &optional for-killing) |
50 | 534 "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
|
535 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
|
536 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
|
537 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
|
538 a temp file). |
8e9589a87f9b
(server-log): Add `client' arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46907
diff
changeset
|
539 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
|
540 (let ((next-buffer nil) |
10961
88cba63f2a9b
(server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents:
10281
diff
changeset
|
541 (killed nil) |
50 | 542 (old-clients server-clients)) |
543 (while old-clients | |
544 (let ((client (car old-clients))) | |
47517
8e9589a87f9b
(server-log): Add `client' arg.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46907
diff
changeset
|
545 (or next-buffer |
50 | 546 (setq next-buffer (nth 1 (memq buffer client)))) |
547 (delq buffer client) | |
10281
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
548 ;; Delete all dead buffers from CLIENT. |
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
549 (let ((tail client)) |
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
550 (while tail |
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
551 (and (bufferp (car tail)) |
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
552 (null (buffer-name (car tail))) |
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
553 (delq (car tail) client)) |
44d98e169823
(server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents:
10218
diff
changeset
|
554 (setq tail (cdr tail)))) |
50 | 555 ;; If client now has no pending buffers, |
556 ;; 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
|
557 (unless (cdr client) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
558 (delete-process (car client)) |
2d55f7e8ff64
Use built-in network primitives.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47524
diff
changeset
|
559 (server-log "Close" (car client)) |
50 | 560 (setq server-clients (delq client server-clients)))) |
561 (setq old-clients (cdr old-clients))) | |
73559
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
562 (when (and (bufferp buffer) (buffer-name buffer)) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
563 ;; We may or may not kill this buffer; |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
564 ;; if we do, do not call server-buffer-done recursively |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
565 ;; from kill-buffer-hook. |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
566 (let ((server-kill-buffer-running t)) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
567 (with-current-buffer buffer |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
568 (setq server-buffer-clients nil) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
569 (run-hooks 'server-done-hook)) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
570 ;; Notice whether server-done-hook killed the buffer. |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
571 (if (null (buffer-name buffer)) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
572 (setq killed t) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
573 ;; Don't bother killing or burying the buffer |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
574 ;; when we are called from kill-buffer. |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
575 (unless for-killing |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
576 (when (and (not killed) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
577 server-kill-new-buffers |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
578 (with-current-buffer buffer |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
579 (not server-existing-buffer))) |
21941
1baa3e876ad0
(server-buffer-done): Bind server-kill-buffer-running
Richard M. Stallman <rms@gnu.org>
parents:
19418
diff
changeset
|
580 (setq killed t) |
73559
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
581 (bury-buffer buffer) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
582 (kill-buffer buffer)) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
583 (unless killed |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
584 (if (server-temp-file-p buffer) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
585 (progn |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
586 (kill-buffer buffer) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
587 (setq killed t)) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
588 (bury-buffer buffer))))))) |
10961
88cba63f2a9b
(server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents:
10281
diff
changeset
|
589 (list next-buffer killed))) |
50 | 590 |
48123
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
591 (defun server-temp-file-p (&optional buffer) |
50 | 592 "Return non-nil if BUFFER contains a file considered temporary. |
593 These are files whose names suggest they are repeatedly | |
594 reused to pass information to another program. | |
595 | |
596 The variable `server-temp-file-regexp' controls which filenames | |
597 are considered temporary." | |
598 (and (buffer-file-name buffer) | |
599 (string-match server-temp-file-regexp (buffer-file-name buffer)))) | |
600 | |
601 (defun server-done () | |
1540 | 602 "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
|
603 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
|
604 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
|
605 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
|
606 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
|
607 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
|
608 (when server-buffer-clients |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
609 (if (server-temp-file-p) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
610 ;; 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
|
611 ;; (unless make-backup-files is nil). |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
612 (let ((version-control nil) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
613 (buffer-backed-up nil)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
614 (save-buffer)) |
73559
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
615 (when (and (buffer-modified-p) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
616 buffer-file-name |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
617 (y-or-n-p (concat "Save file " buffer-file-name "? "))) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
618 (save-buffer))) |
48123
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
619 (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
|
620 |
9883 | 621 ;; Ask before killing a server buffer. |
622 ;; It was suggested to release its client instead, | |
623 ;; but I think that is dangerous--the client would proceed | |
624 ;; 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
|
625 (defun server-kill-buffer-query-function () |
0983fe01e614
(server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents:
6960
diff
changeset
|
626 (or (not server-buffer-clients) |
0983fe01e614
(server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents:
6960
diff
changeset
|
627 (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
|
628 (buffer-name (current-buffer)))))) |
0983fe01e614
(server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents:
6960
diff
changeset
|
629 |
6176
1dbec303c87b
(kill-emacs-query-functions, kill-buffer-query-functions):
Richard M. Stallman <rms@gnu.org>
parents:
5749
diff
changeset
|
630 (add-hook 'kill-buffer-query-functions |
6993
0983fe01e614
(server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents:
6960
diff
changeset
|
631 '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
|
632 |
6993
0983fe01e614
(server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents:
6960
diff
changeset
|
633 (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
|
634 (let (live-client |
8c8410bc0f1b
(server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents:
7597
diff
changeset
|
635 (tail server-clients)) |
8c8410bc0f1b
(server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents:
7597
diff
changeset
|
636 ;; 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
|
637 (while tail |
73559
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
638 (when (memq t (mapcar 'stringp (mapcar 'buffer-name (cdr (car tail))))) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
639 (setq live-client t)) |
7736
8c8410bc0f1b
(server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents:
7597
diff
changeset
|
640 (setq tail (cdr tail))) |
8c8410bc0f1b
(server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents:
7597
diff
changeset
|
641 (or (not live-client) |
8c8410bc0f1b
(server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents:
7597
diff
changeset
|
642 (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
|
643 |
0983fe01e614
(server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents:
6960
diff
changeset
|
644 (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
|
645 |
18049
f1fa9625e2b9
(server-kill-buffer): Prevent infinite recursion.
Richard M. Stallman <rms@gnu.org>
parents:
17970
diff
changeset
|
646 (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
|
647 "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
|
648 |
17712
41a4624c1e79
(server-buffer-done): New arg FOR-KILLING.
Richard M. Stallman <rms@gnu.org>
parents:
17434
diff
changeset
|
649 (defun server-kill-buffer () |
18049
f1fa9625e2b9
(server-kill-buffer): Prevent infinite recursion.
Richard M. Stallman <rms@gnu.org>
parents:
17970
diff
changeset
|
650 ;; 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
|
651 ;; call kill-buffer. |
f1fa9625e2b9
(server-kill-buffer): Prevent infinite recursion.
Richard M. Stallman <rms@gnu.org>
parents:
17970
diff
changeset
|
652 (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
|
653 (and server-buffer-clients |
1baa3e876ad0
(server-buffer-done): Bind server-kill-buffer-running
Richard M. Stallman <rms@gnu.org>
parents:
19418
diff
changeset
|
654 (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
|
655 (when server-process |
1baa3e876ad0
(server-buffer-done): Bind server-kill-buffer-running
Richard M. Stallman <rms@gnu.org>
parents:
19418
diff
changeset
|
656 (server-buffer-done (current-buffer) t)))))) |
50 | 657 |
658 (defun server-edit (&optional arg) | |
659 "Switch to next server editing buffer; say \"Done\" for current buffer. | |
660 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
|
661 The buffer is also killed if it did not exist before the clients asked for it. |
50 | 662 When all of a client's buffers are marked as \"done\", the client is notified. |
663 | |
664 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
|
665 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
|
666 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
|
667 prevent a backup for it.) The variable `server-temp-file-regexp' controls |
50 | 668 which filenames are considered temporary. |
669 | |
49206
7ebd98bb02a2
(server-process-filter): Use `minibufferp' to test
John Paul Wallington <jpw@pobox.com>
parents:
49187
diff
changeset
|
670 If invoked with a prefix argument, or if there is no server process running, |
50 | 671 starts server process and that is all. Invoked by \\[server-edit]." |
672 (interactive "P") | |
71320
59c8b05c2ce4
* server.el (server-edit): No-op if no server buffers exist.
Chong Yidong <cyd@stupidchicken.com>
parents:
70672
diff
changeset
|
673 (cond |
73611
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
674 ((or arg |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
675 (not server-process) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
676 (memq (process-status server-process) '(signal exit))) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
677 (server-mode 1)) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
678 (server-clients (apply 'server-switch-buffer (server-done))) |
d1bc957e4056
(server-visit-files): Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents:
73604
diff
changeset
|
679 (t (message "No server editing buffers exist")))) |
50 | 680 |
11329
ecbfde696360
(server-switch-buffer): Make first arg optional too;
Roland McGrath <roland@gnu.org>
parents:
11235
diff
changeset
|
681 (defun server-switch-buffer (&optional next-buffer killed-one) |
50 | 682 "Switch to another buffer, preferably one that has a client. |
683 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
|
684 ;; 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
|
685 ;; 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
|
686 ;; 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
|
687 ;; 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
|
688 (if (null next-buffer) |
95ba2ac51138
(server-done): Fix harmlessly wrong arg to save-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47517
diff
changeset
|
689 (if server-clients |
95ba2ac51138
(server-done): Fix harmlessly wrong arg to save-buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
47517
diff
changeset
|
690 (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
|
691 (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
|
692 (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
|
693 (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
|
694 (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
|
695 ;; If NEXT-BUFFER is a dead buffer, remove the server records for it |
50 | 696 ;; 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
|
697 (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
|
698 ;; 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
|
699 (if (functionp server-window) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
700 (funcall server-window next-buffer) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
701 (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
|
702 (if (and win (not server-window)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
703 ;; 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
|
704 (let ((frame (window-frame win))) |
73559
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
705 (when (eq (frame-visible-p frame) 'icon) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
706 (raise-frame frame)) |
48123
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
707 (select-window win) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
708 (set-buffer next-buffer)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
709 ;; Otherwise, let's find an appropriate window. |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
710 (cond ((and (windowp server-window) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
711 (window-live-p server-window)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
712 (select-window server-window)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
713 ((framep server-window) |
73559
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
714 (unless (frame-live-p server-window) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
715 (setq server-window (make-frame))) |
48123
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
716 (select-window (frame-selected-window server-window)))) |
73559
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
717 (when (window-minibuffer-p (selected-window)) |
408b3aee0a29
Add support for TCP sockets.
Juanma Barranquero <lekktu@gmail.com>
parents:
73543
diff
changeset
|
718 (select-window (next-window nil 'nomini 0))) |
48123
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
719 ;; 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
|
720 (when (window-dedicated-p (selected-window)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
721 (select-window |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
722 (get-window-with-predicate |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
723 (lambda (w) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
724 (and (not (window-dedicated-p w)) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
725 (equal (frame-parameter (window-frame w) 'display) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
726 (frame-parameter (selected-frame) 'display)))) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
727 'nomini 'visible (selected-window)))) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
728 (condition-case nil |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
729 (switch-to-buffer next-buffer) |
66755860a8f1
(server-sentinel): Kill buffers if applicable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48069
diff
changeset
|
730 ;; 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
|
731 ;; 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
|
732 (error (pop-to-buffer next-buffer))))))))) |
50 | 733 |
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
|
734 (define-key ctl-x-map "#" 'server-edit) |
42140
49087a9d073e
(server-unload-hook): New function.
Dave Love <fx@gnu.org>
parents:
41075
diff
changeset
|
735 |
49087a9d073e
(server-unload-hook): New function.
Dave Love <fx@gnu.org>
parents:
41075
diff
changeset
|
736 (defun server-unload-hook () |
70672
06de67179ba1
(server-start): Only create a directory if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
70420
diff
changeset
|
737 (server-mode -1) |
42140
49087a9d073e
(server-unload-hook): New function.
Dave Love <fx@gnu.org>
parents:
41075
diff
changeset
|
738 (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
|
739 (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
|
740 (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
|
741 |
70672
06de67179ba1
(server-start): Only create a directory if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
70420
diff
changeset
|
742 (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
|
743 (add-hook 'server-unload-hook 'server-unload-hook) |
1079 | 744 |
745 (provide 'server) | |
658
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
445
diff
changeset
|
746 |
70672
06de67179ba1
(server-start): Only create a directory if needed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
70420
diff
changeset
|
747 ;; arch-tag: 1f7ecb42-f00a-49f8-906d-61995d84c8d6 |
658
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
445
diff
changeset
|
748 ;;; server.el ends here |