annotate lisp/server.el @ 1255:ff06503c93b4

* gud.el (gud-def): Doc fix. (gud-gdb-marker-filter, gud-sdb-marker-filter, gud-dbx-marker-filter): Rename the argument `s' or `str' to `string', and change all uses; these definitions were referring to `string', which is unbound in the lexical context, but which happens to end up being bound to the right thing by the caller, gud-filter. (sdb): Set comint-prompt-regexp, not comint-prompt-pattern; the latter doesn't exist. (gud-dbx-debugger-setup): Use the argument `f', not the variable `file', which happens to be bound in the caller. (gud-filter-insert): The variable `start' is never used. The variable `moving' is unnecessary. The variable `old-buffer' and the unwind-protect form are unneeded, since save-excursion can do their work. The binding of output-after-point should be done after switching to the process's buffer, not in whatever random buffer happens to be current when the process filter is called. There's no need to set the process mark if we've just inserted at its location using insert-before-markers. (gud-read-address): Don't bother setting the variable `result'; it is never used. * gud.el (gud-mode-map): Bind gud-refresh to C-c C-l, not C-c l; the latter is reserved for the user's purposes. * gud.el (gdb, sdb, dbx): Use C-c C-r ("resume") for continuing, instead of C-c C-c. C-c C-c should be comint-interrupt-subjob; it's important to have that available, and the C-c C-c binding is consistent with all the other comint-derived modes.
author Jim Blandy <jimb@redhat.com>
date Tue, 29 Sep 1992 07:45:05 +0000
parents 0c960257c363
children f3554332993b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 445
diff changeset
1 ;;; server.el --- Lisp code for GNU Emacs running as server process.
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 445
diff changeset
2
1079
0c960257c363 entered into RCS
Roland McGrath <roland@gnu.org>
parents: 844
diff changeset
3 ;; Copyright (C) 1986, 1987, 1992 Free Software Foundation, Inc.
844
bf829a2d63b4 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 814
diff changeset
4
787
3cece0106722 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 702
diff changeset
5 ;; Author: William Sommerfeld <wesommer@athena.mit.edu>
814
38b2499cb3e9 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 807
diff changeset
6 ;; Keywords: processes
787
3cece0106722 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 702
diff changeset
7
3cece0106722 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 702
diff changeset
8 ;; Changes by peck@sun.com and by rms.
3cece0106722 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 702
diff changeset
9
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
10 ;; This file is part of GNU Emacs.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
11
38da30b6253c Initial revision
root <root>
parents:
diff changeset
12 ;; GNU Emacs is free software; you can redistribute it and/or modify
38da30b6253c Initial revision
root <root>
parents:
diff changeset
13 ;; 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
14 ;; the Free Software Foundation; either version 2, or (at your option)
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
15 ;; any later version.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
16
38da30b6253c Initial revision
root <root>
parents:
diff changeset
17 ;; GNU Emacs is distributed in the hope that it will be useful,
38da30b6253c Initial revision
root <root>
parents:
diff changeset
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
38da30b6253c Initial revision
root <root>
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
38da30b6253c Initial revision
root <root>
parents:
diff changeset
20 ;; GNU General Public License for more details.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
21
38da30b6253c Initial revision
root <root>
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
38da30b6253c Initial revision
root <root>
parents:
diff changeset
23 ;; along with GNU Emacs; see the file COPYING. If not, write to
38da30b6253c Initial revision
root <root>
parents:
diff changeset
24 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
25
787
3cece0106722 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 702
diff changeset
26 ;;; Commentary:
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
27
38da30b6253c Initial revision
root <root>
parents:
diff changeset
28 ;;; This Lisp code is run in Emacs when it is to operate as
38da30b6253c Initial revision
root <root>
parents:
diff changeset
29 ;;; a server for other processes.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
30
38da30b6253c Initial revision
root <root>
parents:
diff changeset
31 ;;; Load this library and do M-x server-edit to enable Emacs as a server.
445
2a2230dd1b1c *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 413
diff changeset
32 ;;; Emacs runs the program ../arch-lib/emacsserver as a subprocess
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
33 ;;; for communication with clients. If there are no client buffers to edit,
38da30b6253c Initial revision
root <root>
parents:
diff changeset
34 ;;; server-edit acts like (switch-to-buffer (other-buffer))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
35
38da30b6253c Initial revision
root <root>
parents:
diff changeset
36 ;;; When some other program runs "the editor" to edit a file,
445
2a2230dd1b1c *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 413
diff changeset
37 ;;; "the editor" can be the Emacs client program ../lib-src/emacsclient.
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
38 ;;; This program transmits the file names to Emacs through
38da30b6253c Initial revision
root <root>
parents:
diff changeset
39 ;;; the server subprocess, and Emacs visits them and lets you edit them.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
40
38da30b6253c Initial revision
root <root>
parents:
diff changeset
41 ;;; Note that any number of clients may dispatch files to emacs to be edited.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
42
38da30b6253c Initial revision
root <root>
parents:
diff changeset
43 ;;; When you finish editing a Server buffer, again call server-edit
38da30b6253c Initial revision
root <root>
parents:
diff changeset
44 ;;; to mark that buffer as done for the client and switch to the next
38da30b6253c Initial revision
root <root>
parents:
diff changeset
45 ;;; Server buffer. When all the buffers for a client have been edited
38da30b6253c Initial revision
root <root>
parents:
diff changeset
46 ;;; and exited with server-edit, the client "editor" will return
38da30b6253c Initial revision
root <root>
parents:
diff changeset
47 ;;; to the program that invoked it.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
48
38da30b6253c Initial revision
root <root>
parents:
diff changeset
49 ;;; Your editing commands and Emacs's display output go to and from
38da30b6253c Initial revision
root <root>
parents:
diff changeset
50 ;;; the terminal in the usual way. Thus, server operation is possible
38da30b6253c Initial revision
root <root>
parents:
diff changeset
51 ;;; only when Emacs can talk to the terminal at the time you invoke
38da30b6253c Initial revision
root <root>
parents:
diff changeset
52 ;;; the client. This is possible in four cases:
38da30b6253c Initial revision
root <root>
parents:
diff changeset
53
38da30b6253c Initial revision
root <root>
parents:
diff changeset
54 ;;; 1. On a window system, where Emacs runs in one window and the
38da30b6253c Initial revision
root <root>
parents:
diff changeset
55 ;;; program that wants to use "the editor" runs in another.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
56
38da30b6253c Initial revision
root <root>
parents:
diff changeset
57 ;;; 2. On a multi-terminal system, where Emacs runs on one terminal and the
38da30b6253c Initial revision
root <root>
parents:
diff changeset
58 ;;; program that wants to use "the editor" runs on another.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
59
38da30b6253c Initial revision
root <root>
parents:
diff changeset
60 ;;; 3. When the program that wants to use "the editor" is running
38da30b6253c Initial revision
root <root>
parents:
diff changeset
61 ;;; as a subprocess of Emacs.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
62
38da30b6253c Initial revision
root <root>
parents:
diff changeset
63 ;;; 4. On a system with job control, when Emacs is suspended, the program
38da30b6253c Initial revision
root <root>
parents:
diff changeset
64 ;;; that wants to use "the editor" will stop and display
38da30b6253c Initial revision
root <root>
parents:
diff changeset
65 ;;; "Waiting for Emacs...". It can then be suspended, and Emacs can be
38da30b6253c Initial revision
root <root>
parents:
diff changeset
66 ;;; brought into the foreground for editing. When done editing, Emacs is
38da30b6253c Initial revision
root <root>
parents:
diff changeset
67 ;;; suspended again, and the client program is brought into the foreground.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
68
38da30b6253c Initial revision
root <root>
parents:
diff changeset
69 ;;; The buffer local variable "server-buffer-clients" lists
38da30b6253c Initial revision
root <root>
parents:
diff changeset
70 ;;; the clients who are waiting for this buffer to be edited.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
71 ;;; The global variable "server-clients" lists all the waiting clients,
38da30b6253c Initial revision
root <root>
parents:
diff changeset
72 ;;; 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
73
3cece0106722 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 702
diff changeset
74 ;;; Code:
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
75
38da30b6253c Initial revision
root <root>
parents:
diff changeset
76 (defvar server-program "emacsserver"
38da30b6253c Initial revision
root <root>
parents:
diff changeset
77 "*The program to use as the edit server")
38da30b6253c Initial revision
root <root>
parents:
diff changeset
78
38da30b6253c Initial revision
root <root>
parents:
diff changeset
79 (defvar server-visit-hook nil
38da30b6253c Initial revision
root <root>
parents:
diff changeset
80 "*List of hooks to call when switching to a buffer for the Emacs server.")
38da30b6253c Initial revision
root <root>
parents:
diff changeset
81
38da30b6253c Initial revision
root <root>
parents:
diff changeset
82 (defvar server-process nil
38da30b6253c Initial revision
root <root>
parents:
diff changeset
83 "the current server process")
38da30b6253c Initial revision
root <root>
parents:
diff changeset
84
138
f3f3651d2520 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 50
diff changeset
85 (defvar server-previous-string "")
f3f3651d2520 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 50
diff changeset
86
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
87 (defvar server-clients nil
38da30b6253c Initial revision
root <root>
parents:
diff changeset
88 "List of current server clients.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
89 Each element is (CLIENTID FILES...) where CLIENTID is a string
38da30b6253c Initial revision
root <root>
parents:
diff changeset
90 that can be given to the server process to identify a client.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
91 When a buffer is marked as \"done\", it is removed from this list.")
38da30b6253c Initial revision
root <root>
parents:
diff changeset
92
38da30b6253c Initial revision
root <root>
parents:
diff changeset
93 (defvar server-buffer-clients nil
38da30b6253c Initial revision
root <root>
parents:
diff changeset
94 "List of clientids for clients requesting editing of current buffer.")
38da30b6253c Initial revision
root <root>
parents:
diff changeset
95 ;; Changing major modes should not erase this local.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
96 (put 'server-buffer-clients 'permanent-local t)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
97
38da30b6253c Initial revision
root <root>
parents:
diff changeset
98 (defvar server-temp-file-regexp "^/tmp/Re\\|/draft$"
38da30b6253c Initial revision
root <root>
parents:
diff changeset
99 "*Regexp which should match filenames of temporary files
38da30b6253c Initial revision
root <root>
parents:
diff changeset
100 which are deleted and reused after each edit
38da30b6253c Initial revision
root <root>
parents:
diff changeset
101 by the programs that invoke the emacs server.")
38da30b6253c Initial revision
root <root>
parents:
diff changeset
102
38da30b6253c Initial revision
root <root>
parents:
diff changeset
103 (make-variable-buffer-local 'server-buffer-clients)
702
c89caa39704a *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 658
diff changeset
104 (put 'server-buffer-clients 'permanent-local t)
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
105 (setq-default server-buffer-clients nil)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
106 (or (assq 'server-buffer-clients minor-mode-alist)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
107 (setq minor-mode-alist (cons '(server-buffer-clients " Server") minor-mode-alist)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
108
38da30b6253c Initial revision
root <root>
parents:
diff changeset
109 ;; If a *server* buffer exists,
38da30b6253c Initial revision
root <root>
parents:
diff changeset
110 ;; write STRING to it for logging purposes.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
111 (defun server-log (string)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
112 (if (get-buffer "*server*")
38da30b6253c Initial revision
root <root>
parents:
diff changeset
113 (save-excursion
38da30b6253c Initial revision
root <root>
parents:
diff changeset
114 (set-buffer "*server*")
38da30b6253c Initial revision
root <root>
parents:
diff changeset
115 (goto-char (point-max))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
116 (insert string)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
117 (or (bobp) (newline)))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
118
38da30b6253c Initial revision
root <root>
parents:
diff changeset
119 (defun server-sentinel (proc msg)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
120 (cond ((eq (process-status proc) 'exit)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
121 (server-log (message "Server subprocess exited")))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
122 ((eq (process-status proc) 'signal)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
123 (server-log (message "Server subprocess killed")))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
124
256
7e4c7ef44243 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 138
diff changeset
125 ;;;###autoload
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
126 (defun server-start (&optional leave-dead)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
127 "Allow this Emacs process to be a server for client processes.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
128 This starts a server communications subprocess through which
38da30b6253c Initial revision
root <root>
parents:
diff changeset
129 client \"editors\" can send your editing commands to this Emacs job.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
130 To use the server, set up the program `etc/emacsclient' in the
38da30b6253c Initial revision
root <root>
parents:
diff changeset
131 Emacs distribution as your standard \"editor\".
38da30b6253c Initial revision
root <root>
parents:
diff changeset
132
38da30b6253c Initial revision
root <root>
parents:
diff changeset
133 Prefix arg means just kill any existing server communications subprocess."
38da30b6253c Initial revision
root <root>
parents:
diff changeset
134 (interactive "P")
38da30b6253c Initial revision
root <root>
parents:
diff changeset
135 ;; kill it dead!
38da30b6253c Initial revision
root <root>
parents:
diff changeset
136 (if server-process
38da30b6253c Initial revision
root <root>
parents:
diff changeset
137 (progn
38da30b6253c Initial revision
root <root>
parents:
diff changeset
138 (set-process-sentinel server-process nil)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
139 (condition-case () (delete-process server-process) (error nil))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
140 (condition-case () (delete-file "~/.emacs_server") (error nil))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
141 ;; If we already had a server, clear out associated status.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
142 (while server-clients
38da30b6253c Initial revision
root <root>
parents:
diff changeset
143 (let ((buffer (nth 1 (car server-clients))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
144 (server-buffer-done buffer)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
145 (if leave-dead
38da30b6253c Initial revision
root <root>
parents:
diff changeset
146 nil
38da30b6253c Initial revision
root <root>
parents:
diff changeset
147 (if server-process
38da30b6253c Initial revision
root <root>
parents:
diff changeset
148 (server-log (message "Restarting server")))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
149 (setq server-process (start-process "server" nil server-program))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
150 (set-process-sentinel server-process 'server-sentinel)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
151 (set-process-filter server-process 'server-process-filter)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
152 (process-kill-without-query server-process)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
153
38da30b6253c Initial revision
root <root>
parents:
diff changeset
154 ;Process a request from the server to edit some files.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
155 ;Format of STRING is "Client: CLIENTID PATH PATH PATH... \n"
38da30b6253c Initial revision
root <root>
parents:
diff changeset
156 (defun server-process-filter (proc string)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
157 (server-log string)
138
f3f3651d2520 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 50
diff changeset
158 (setq string (concat server-previous-string string))
f3f3651d2520 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 50
diff changeset
159 (if (not (and (eq ?\n (aref string (1- (length string))))
f3f3651d2520 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 50
diff changeset
160 (eq 0 (string-match "Client: " string))))
f3f3651d2520 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 50
diff changeset
161 ;; If input is not complete, save it for later.
f3f3651d2520 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 50
diff changeset
162 (setq server-previous-string string)
f3f3651d2520 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 50
diff changeset
163 ;; If it is complete, process it now, and discard what was saved.
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
164 (setq string (substring string (match-end 0)))
138
f3f3651d2520 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 50
diff changeset
165 (setq server-previous-string "")
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
166 (let ((client (list (substring string 0 (string-match " " string))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
167 (files nil)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
168 (lineno 1))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
169 (setq string (substring string (match-end 0)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
170 (while (string-match "[^ ]+ " string)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
171 (let ((arg
38da30b6253c Initial revision
root <root>
parents:
diff changeset
172 (substring string (match-beginning 0) (1- (match-end 0)))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
173 (setq string (substring string (match-end 0)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
174 (if (string-match "\\`\\+[0-9]+\\'" arg)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
175 (setq lineno (read (substring arg 1)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
176 (setq files
38da30b6253c Initial revision
root <root>
parents:
diff changeset
177 (cons (list arg lineno)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
178 files))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
179 (setq lineno 1))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
180 (server-visit-files files client)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
181 ;; CLIENT is now a list (CLIENTNUM BUFFERS...)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
182 (setq server-clients (cons client server-clients))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
183 (switch-to-buffer (nth 1 client))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
184 (message (substitute-command-keys
38da30b6253c Initial revision
root <root>
parents:
diff changeset
185 "When done with a buffer, type \\[server-edit].")))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
186
38da30b6253c Initial revision
root <root>
parents:
diff changeset
187 (defun server-visit-files (files client)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
188 "Finds FILES and returns the list CLIENT with the buffers nconc'd.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
189 FILES is an alist whose elements are (FILENAME LINENUMBER)."
38da30b6253c Initial revision
root <root>
parents:
diff changeset
190 (let (client-record)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
191 (while files
38da30b6253c Initial revision
root <root>
parents:
diff changeset
192 (save-excursion
38da30b6253c Initial revision
root <root>
parents:
diff changeset
193 ;; If there is an existing buffer modified or the file is modified,
38da30b6253c Initial revision
root <root>
parents:
diff changeset
194 ;; revert it.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
195 ;; If there is an existing buffer with deleted file, offer to write it.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
196 (let* ((filen (car (car files)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
197 (obuf (get-file-buffer filen)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
198 (if (and obuf (set-buffer obuf))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
199 (if (file-exists-p filen)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
200 (if (or (not (verify-visited-file-modtime obuf))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
201 (buffer-modified-p obuf))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
202 (revert-buffer t nil))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
203 (if (y-or-n-p
38da30b6253c Initial revision
root <root>
parents:
diff changeset
204 (concat "File no longer exists: "
38da30b6253c Initial revision
root <root>
parents:
diff changeset
205 filen
38da30b6253c Initial revision
root <root>
parents:
diff changeset
206 ", write buffer to file? "))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
207 (write-file filen)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
208 (set-buffer (find-file-noselect filen))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
209 (run-hooks 'server-visit-hook)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
210 (goto-line (nth 1 (car files)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
211 (setq server-buffer-clients (cons (car client) server-buffer-clients))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
212 (setq client-record (cons (current-buffer) client-record)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
213 (setq files (cdr files)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
214 (nconc client client-record)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
215
38da30b6253c Initial revision
root <root>
parents:
diff changeset
216 (defun server-buffer-done (buffer)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
217 "Mark BUFFER as \"done\" for its client(s).
38da30b6253c Initial revision
root <root>
parents:
diff changeset
218 Buries the buffer, and returns another server buffer
38da30b6253c Initial revision
root <root>
parents:
diff changeset
219 as a suggestion for what to select next."
38da30b6253c Initial revision
root <root>
parents:
diff changeset
220 (let ((running (eq (process-status server-process) 'run))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
221 (next-buffer nil)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
222 (old-clients server-clients))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
223 (while old-clients
38da30b6253c Initial revision
root <root>
parents:
diff changeset
224 (let ((client (car old-clients)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
225 (or next-buffer
38da30b6253c Initial revision
root <root>
parents:
diff changeset
226 (setq next-buffer (nth 1 (memq buffer client))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
227 (delq buffer client)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
228 ;; If client now has no pending buffers,
38da30b6253c Initial revision
root <root>
parents:
diff changeset
229 ;; tell it that it is done, and forget it entirely.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
230 (if (cdr client) nil
38da30b6253c Initial revision
root <root>
parents:
diff changeset
231 (if running
38da30b6253c Initial revision
root <root>
parents:
diff changeset
232 (progn
38da30b6253c Initial revision
root <root>
parents:
diff changeset
233 (send-string server-process
38da30b6253c Initial revision
root <root>
parents:
diff changeset
234 (format "Close: %s Done\n" (car client)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
235 (server-log (format "Close: %s Done\n" (car client)))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
236 (setq server-clients (delq client server-clients))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
237 (setq old-clients (cdr old-clients)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
238 (if (buffer-name buffer)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
239 (save-excursion
38da30b6253c Initial revision
root <root>
parents:
diff changeset
240 (set-buffer buffer)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
241 (setq server-buffer-clients nil)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
242 (bury-buffer buffer)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
243 next-buffer))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
244
38da30b6253c Initial revision
root <root>
parents:
diff changeset
245 (defun server-temp-file-p (buffer)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
246 "Return non-nil if BUFFER contains a file considered temporary.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
247 These are files whose names suggest they are repeatedly
38da30b6253c Initial revision
root <root>
parents:
diff changeset
248 reused to pass information to another program.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
249
38da30b6253c Initial revision
root <root>
parents:
diff changeset
250 The variable `server-temp-file-regexp' controls which filenames
38da30b6253c Initial revision
root <root>
parents:
diff changeset
251 are considered temporary."
38da30b6253c Initial revision
root <root>
parents:
diff changeset
252 (and (buffer-file-name buffer)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
253 (string-match server-temp-file-regexp (buffer-file-name buffer))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
254
38da30b6253c Initial revision
root <root>
parents:
diff changeset
255 (defun server-done ()
38da30b6253c Initial revision
root <root>
parents:
diff changeset
256 "Offer to save current buffer, mark it as \"done\" for clients,
38da30b6253c Initial revision
root <root>
parents:
diff changeset
257 bury it, and return a suggested buffer to select next."
38da30b6253c Initial revision
root <root>
parents:
diff changeset
258 (let ((buffer (current-buffer)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
259 (if server-buffer-clients
38da30b6253c Initial revision
root <root>
parents:
diff changeset
260 (progn
38da30b6253c Initial revision
root <root>
parents:
diff changeset
261 (if (server-temp-file-p buffer)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
262 (progn (save-buffer)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
263 (write-region (point-min) (point-max)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
264 (concat buffer-file-name "~"))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
265 (kill-buffer buffer))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
266 (if (and (buffer-modified-p)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
267 (y-or-n-p (concat "Save file " buffer-file-name "? ")))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
268 (save-buffer buffer)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
269 (server-buffer-done buffer)))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
270
38da30b6253c Initial revision
root <root>
parents:
diff changeset
271 (defun server-edit (&optional arg)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
272 "Switch to next server editing buffer; say \"Done\" for current buffer.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
273 If a server buffer is current, it is marked \"done\" and optionally saved.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
274 When all of a client's buffers are marked as \"done\", the client is notified.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
275
38da30b6253c Initial revision
root <root>
parents:
diff changeset
276 Temporary files such as MH <draft> files are always saved and backed up,
38da30b6253c Initial revision
root <root>
parents:
diff changeset
277 no questions asked. The variable `server-temp-file-regexp' controls
38da30b6253c Initial revision
root <root>
parents:
diff changeset
278 which filenames are considered temporary.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
279
38da30b6253c Initial revision
root <root>
parents:
diff changeset
280 If invoked with a prefix argument, or if there is no server process running,
38da30b6253c Initial revision
root <root>
parents:
diff changeset
281 starts server process and that is all. Invoked by \\[server-edit]."
38da30b6253c Initial revision
root <root>
parents:
diff changeset
282
38da30b6253c Initial revision
root <root>
parents:
diff changeset
283 (interactive "P")
38da30b6253c Initial revision
root <root>
parents:
diff changeset
284 (if (or arg
38da30b6253c Initial revision
root <root>
parents:
diff changeset
285 (not server-process)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
286 (memq (process-status server-process) '(signal exit)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
287 (server-start nil)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
288 (server-switch-buffer (server-done))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
289
38da30b6253c Initial revision
root <root>
parents:
diff changeset
290 (defun server-switch-buffer (next-buffer)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
291 "Switch to another buffer, preferably one that has a client.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
292 Arg NEXT-BUFFER is a suggestion; if it is a live buffer, use it."
38da30b6253c Initial revision
root <root>
parents:
diff changeset
293 (if next-buffer
38da30b6253c Initial revision
root <root>
parents:
diff changeset
294 (if (and (bufferp next-buffer)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
295 (buffer-name next-buffer))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
296 (switch-to-buffer next-buffer)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
297 ;; If NEXT-BUFFER is a dead buffer,
38da30b6253c Initial revision
root <root>
parents:
diff changeset
298 ;; remove the server records for it
38da30b6253c Initial revision
root <root>
parents:
diff changeset
299 ;; and try the next surviving server buffer.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
300 (server-switch-buffer
38da30b6253c Initial revision
root <root>
parents:
diff changeset
301 (server-buffer-done next-buffer)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
302 (if server-clients
38da30b6253c Initial revision
root <root>
parents:
diff changeset
303 (server-switch-buffer (nth 1 (car server-clients)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
304 (switch-to-buffer (other-buffer)))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
305
38da30b6253c Initial revision
root <root>
parents:
diff changeset
306 (global-set-key "\C-x#" 'server-edit)
1079
0c960257c363 entered into RCS
Roland McGrath <roland@gnu.org>
parents: 844
diff changeset
307
0c960257c363 entered into RCS
Roland McGrath <roland@gnu.org>
parents: 844
diff changeset
308 (provide 'server)
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 445
diff changeset
309
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 445
diff changeset
310 ;;; server.el ends here