annotate lisp/server.el @ 16883:d1d4d81f9ece

Change all uses of win95, winnt, and win32 into Windows 95, Windows NT, and W32, respectively. Expand "win" substring in variables referring to Microsoft Windows constructs into "windows". Canonicalize header comments to use same terminology.
author Geoff Voelker <voelker@cs.washington.edu>
date Mon, 20 Jan 1997 00:34:34 +0000
parents 4b8907e5a574
children 5fb0f4a5336f
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
11235
e6bdaaa6ce1b Update copyright.
Karl Heuer <kwzh@gnu.org>
parents: 10961
diff changeset
3 ;; Copyright (C) 1986, 1987, 1992, 1994, 1995 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
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
23 ;; along with GNU Emacs; see the file COPYING. If not, write to the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
24 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
25 ;; Boston, MA 02111-1307, USA.
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
26
787
3cece0106722 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 702
diff changeset
27 ;;; Commentary:
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
28
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
29 ;; This Lisp code is run in Emacs when it is to operate as
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
30 ;; a server for other processes.
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
31
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
32 ;; Load this library and do M-x server-edit to enable Emacs as a server.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
33 ;; Emacs runs the program ../arch-lib/emacsserver as a subprocess
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
34 ;; for communication with clients. If there are no client buffers to edit,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
35 ;; server-edit acts like (switch-to-buffer (other-buffer))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
36
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
37 ;; When some other program runs "the editor" to edit a file,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
38 ;; "the editor" can be the Emacs client program ../lib-src/emacsclient.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
39 ;; This program transmits the file names to Emacs through
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
40 ;; the server subprocess, and Emacs visits them and lets you edit them.
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
41
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
42 ;; Note that any number of clients may dispatch files to emacs to be edited.
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
43
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
44 ;; When you finish editing a Server buffer, again call server-edit
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
45 ;; to mark that buffer as done for the client and switch to the next
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
46 ;; Server buffer. When all the buffers for a client have been edited
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
47 ;; and exited with server-edit, the client "editor" will return
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
48 ;; to the program that invoked it.
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
49
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
50 ;; Your editing commands and Emacs's display output go to and from
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
51 ;; the terminal in the usual way. Thus, server operation is possible
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
52 ;; only when Emacs can talk to the terminal at the time you invoke
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
53 ;; the client. This is possible in four cases:
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
54
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
55 ;; 1. On a window system, where Emacs runs in one window and the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
56 ;; program that wants to use "the editor" runs in another.
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
57
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
58 ;; 2. On a multi-terminal system, where Emacs runs on one terminal and the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
59 ;; program that wants to use "the editor" runs on another.
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
60
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
61 ;; 3. When the program that wants to use "the editor" is running
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
62 ;; as a subprocess of Emacs.
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
63
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
64 ;; 4. On a system with job control, when Emacs is suspended, the program
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
65 ;; that wants to use "the editor" will stop and display
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
66 ;; "Waiting for Emacs...". It can then be suspended, and Emacs can be
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
67 ;; brought into the foreground for editing. When done editing, Emacs is
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
68 ;; suspended again, and the client program is brought into the foreground.
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
69
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
70 ;; The buffer local variable "server-buffer-clients" lists
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
71 ;; the clients who are waiting for this buffer to be edited.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
72 ;; The global variable "server-clients" lists all the waiting clients,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13468
diff changeset
73 ;; 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
74
3cece0106722 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 702
diff changeset
75 ;;; Code:
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
76
6176
1dbec303c87b (kill-emacs-query-functions, kill-buffer-query-functions):
Richard M. Stallman <rms@gnu.org>
parents: 5749
diff changeset
77 (defvar server-program (expand-file-name "emacsserver" exec-directory)
5749
4555bdf89b40 (server-program): Add exec-directory to value.
Richard M. Stallman <rms@gnu.org>
parents: 4500
diff changeset
78 "*The program to use as the edit server.")
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
79
38da30b6253c Initial revision
root <root>
parents:
diff changeset
80 (defvar server-visit-hook nil
2866
48ddb3600ae6 * server.el (server-switch-hook): New hook.
Jim Blandy <jimb@redhat.com>
parents: 1540
diff changeset
81 "*List of hooks to call when visiting a file for the Emacs server.")
48ddb3600ae6 * server.el (server-switch-hook): New hook.
Jim Blandy <jimb@redhat.com>
parents: 1540
diff changeset
82
48ddb3600ae6 * server.el (server-switch-hook): New hook.
Jim Blandy <jimb@redhat.com>
parents: 1540
diff changeset
83 (defvar server-switch-hook nil
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
84 "*List of hooks to call when switching to a buffer for the Emacs server.")
38da30b6253c Initial revision
root <root>
parents:
diff changeset
85
7597
99a600c67e82 (server-done-hook): New hook.
Richard M. Stallman <rms@gnu.org>
parents: 7553
diff changeset
86 (defvar server-done-hook nil
99a600c67e82 (server-done-hook): New hook.
Richard M. Stallman <rms@gnu.org>
parents: 7553
diff changeset
87 "*List of hooks to call when done editing a buffer for the Emacs server.")
99a600c67e82 (server-done-hook): New hook.
Richard M. Stallman <rms@gnu.org>
parents: 7553
diff changeset
88
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
89 (defvar server-process nil
38da30b6253c Initial revision
root <root>
parents:
diff changeset
90 "the current server process")
38da30b6253c Initial revision
root <root>
parents:
diff changeset
91
138
f3f3651d2520 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 50
diff changeset
92 (defvar server-previous-string "")
f3f3651d2520 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 50
diff changeset
93
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
94 (defvar server-clients nil
38da30b6253c Initial revision
root <root>
parents:
diff changeset
95 "List of current server clients.
7736
8c8410bc0f1b (server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents: 7597
diff changeset
96 Each element is (CLIENTID BUFFERS...) where CLIENTID is a string
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
97 that can be given to the server process to identify a client.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
98 When a buffer is marked as \"done\", it is removed from this list.")
38da30b6253c Initial revision
root <root>
parents:
diff changeset
99
38da30b6253c Initial revision
root <root>
parents:
diff changeset
100 (defvar server-buffer-clients nil
38da30b6253c Initial revision
root <root>
parents:
diff changeset
101 "List of clientids 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
102 (make-variable-buffer-local 'server-buffer-clients)
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
103 ;; Changing major modes should not erase this local.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
104 (put 'server-buffer-clients 'permanent-local t)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
105
3661
65d530f613a8 (server-window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 2866
diff changeset
106 (defvar server-window nil
65d530f613a8 (server-window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 2866
diff changeset
107 "*The window to use for selecting Emacs server buffers.
65d530f613a8 (server-window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 2866
diff changeset
108 If nil, use the selected window.
65d530f613a8 (server-window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 2866
diff changeset
109 If it is a frame, use the frame's selected window.")
65d530f613a8 (server-window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 2866
diff changeset
110
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
111 (defvar server-temp-file-regexp "^/tmp/Re\\|/draft$"
38da30b6253c Initial revision
root <root>
parents:
diff changeset
112 "*Regexp which should match filenames of temporary files
38da30b6253c Initial revision
root <root>
parents:
diff changeset
113 which are deleted and reused after each edit
38da30b6253c Initial revision
root <root>
parents:
diff changeset
114 by the programs that invoke the emacs server.")
38da30b6253c Initial revision
root <root>
parents:
diff changeset
115
38da30b6253c Initial revision
root <root>
parents:
diff changeset
116 (or (assq 'server-buffer-clients minor-mode-alist)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
117 (setq minor-mode-alist (cons '(server-buffer-clients " Server") minor-mode-alist)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
118
38da30b6253c Initial revision
root <root>
parents:
diff changeset
119 ;; If a *server* buffer exists,
38da30b6253c Initial revision
root <root>
parents:
diff changeset
120 ;; write STRING to it for logging purposes.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
121 (defun server-log (string)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
122 (if (get-buffer "*server*")
38da30b6253c Initial revision
root <root>
parents:
diff changeset
123 (save-excursion
38da30b6253c Initial revision
root <root>
parents:
diff changeset
124 (set-buffer "*server*")
38da30b6253c Initial revision
root <root>
parents:
diff changeset
125 (goto-char (point-max))
13468
2c8da6b3b9e0 (server-log): Record the current time.
Richard M. Stallman <rms@gnu.org>
parents: 13157
diff changeset
126 (insert (current-time-string) " " string)
2c8da6b3b9e0 (server-log): Record the current time.
Richard M. Stallman <rms@gnu.org>
parents: 13157
diff changeset
127 (or (bolp) (newline)))))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
128
38da30b6253c Initial revision
root <root>
parents:
diff changeset
129 (defun server-sentinel (proc msg)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
130 (cond ((eq (process-status proc) 'exit)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
131 (server-log (message "Server subprocess exited")))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
132 ((eq (process-status proc) 'signal)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
133 (server-log (message "Server subprocess killed")))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
134
256
7e4c7ef44243 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 138
diff changeset
135 ;;;###autoload
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
136 (defun server-start (&optional leave-dead)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
137 "Allow this Emacs process to be a server for client processes.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
138 This starts a server communications subprocess through which
38da30b6253c Initial revision
root <root>
parents:
diff changeset
139 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
140 To use the server, set up the program `emacsclient' in the
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
141 Emacs distribution as your standard \"editor\".
38da30b6253c Initial revision
root <root>
parents:
diff changeset
142
38da30b6253c Initial revision
root <root>
parents:
diff changeset
143 Prefix arg means just kill any existing server communications subprocess."
38da30b6253c Initial revision
root <root>
parents:
diff changeset
144 (interactive "P")
38da30b6253c Initial revision
root <root>
parents:
diff changeset
145 ;; kill it dead!
38da30b6253c Initial revision
root <root>
parents:
diff changeset
146 (if server-process
38da30b6253c Initial revision
root <root>
parents:
diff changeset
147 (progn
38da30b6253c Initial revision
root <root>
parents:
diff changeset
148 (set-process-sentinel server-process nil)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
149 (condition-case () (delete-process server-process) (error nil))))
16789
85b1a10101ff (server-start): Don't delete ~/.emacs-server.
Richard M. Stallman <rms@gnu.org>
parents: 16075
diff changeset
150 ;; Delete the socket files made by previous server invocations.
13157
31242cebf1d3 (server-start): Try both full hostname and shortened
Richard M. Stallman <rms@gnu.org>
parents: 13070
diff changeset
151 (let* ((sysname (system-name))
31242cebf1d3 (server-start): Try both full hostname and shortened
Richard M. Stallman <rms@gnu.org>
parents: 13070
diff changeset
152 (dot-index (string-match "\\." sysname)))
31242cebf1d3 (server-start): Try both full hostname and shortened
Richard M. Stallman <rms@gnu.org>
parents: 13070
diff changeset
153 (condition-case ()
16789
85b1a10101ff (server-start): Don't delete ~/.emacs-server.
Richard M. Stallman <rms@gnu.org>
parents: 16075
diff changeset
154 (delete-file (format "~/.emacs-server-%s" sysname))
85b1a10101ff (server-start): Don't delete ~/.emacs-server.
Richard M. Stallman <rms@gnu.org>
parents: 16075
diff changeset
155 (error nil))
85b1a10101ff (server-start): Don't delete ~/.emacs-server.
Richard M. Stallman <rms@gnu.org>
parents: 16075
diff changeset
156 (condition-case ()
13157
31242cebf1d3 (server-start): Try both full hostname and shortened
Richard M. Stallman <rms@gnu.org>
parents: 13070
diff changeset
157 (delete-file (format "/tmp/esrv%d-%s" (user-uid) sysname))
31242cebf1d3 (server-start): Try both full hostname and shortened
Richard M. Stallman <rms@gnu.org>
parents: 13070
diff changeset
158 (error nil))
31242cebf1d3 (server-start): Try both full hostname and shortened
Richard M. Stallman <rms@gnu.org>
parents: 13070
diff changeset
159 ;; In case the server file name was made with a domainless hostname,
31242cebf1d3 (server-start): Try both full hostname and shortened
Richard M. Stallman <rms@gnu.org>
parents: 13070
diff changeset
160 ;; try deleting that name too.
31242cebf1d3 (server-start): Try both full hostname and shortened
Richard M. Stallman <rms@gnu.org>
parents: 13070
diff changeset
161 (if dot-index
16789
85b1a10101ff (server-start): Don't delete ~/.emacs-server.
Richard M. Stallman <rms@gnu.org>
parents: 16075
diff changeset
162 (let ((shortname (substring sysname 0 dot-index)))
85b1a10101ff (server-start): Don't delete ~/.emacs-server.
Richard M. Stallman <rms@gnu.org>
parents: 16075
diff changeset
163 (condition-case ()
85b1a10101ff (server-start): Don't delete ~/.emacs-server.
Richard M. Stallman <rms@gnu.org>
parents: 16075
diff changeset
164 (delete-file (format "~/.emacs-server-%s" shortname))
85b1a10101ff (server-start): Don't delete ~/.emacs-server.
Richard M. Stallman <rms@gnu.org>
parents: 16075
diff changeset
165 (error nil))
85b1a10101ff (server-start): Don't delete ~/.emacs-server.
Richard M. Stallman <rms@gnu.org>
parents: 16075
diff changeset
166 (condition-case ()
85b1a10101ff (server-start): Don't delete ~/.emacs-server.
Richard M. Stallman <rms@gnu.org>
parents: 16075
diff changeset
167 (delete-file (format "/tmp/esrv%d-%s" (user-uid) shortname))
85b1a10101ff (server-start): Don't delete ~/.emacs-server.
Richard M. Stallman <rms@gnu.org>
parents: 16075
diff changeset
168 (error nil)))))
85b1a10101ff (server-start): Don't delete ~/.emacs-server.
Richard M. Stallman <rms@gnu.org>
parents: 16075
diff changeset
169 ;; If this Emacs already had a server, clear out associated status.
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
170 (while server-clients
38da30b6253c Initial revision
root <root>
parents:
diff changeset
171 (let ((buffer (nth 1 (car server-clients))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
172 (server-buffer-done buffer)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
173 (if leave-dead
38da30b6253c Initial revision
root <root>
parents:
diff changeset
174 nil
38da30b6253c Initial revision
root <root>
parents:
diff changeset
175 (if server-process
38da30b6253c Initial revision
root <root>
parents:
diff changeset
176 (server-log (message "Restarting server")))
8733
14b8f8a28ace (server-start): Always use pipes for communication.
Richard M. Stallman <rms@gnu.org>
parents: 8202
diff changeset
177 ;; Using a pty is wasteful, and the separate session causes
14b8f8a28ace (server-start): Always use pipes for communication.
Richard M. Stallman <rms@gnu.org>
parents: 8202
diff changeset
178 ;; annoyance sometimes (some systems kill idle sessions).
14b8f8a28ace (server-start): Always use pipes for communication.
Richard M. Stallman <rms@gnu.org>
parents: 8202
diff changeset
179 (let ((process-connection-type nil))
14b8f8a28ace (server-start): Always use pipes for communication.
Richard M. Stallman <rms@gnu.org>
parents: 8202
diff changeset
180 (setq server-process (start-process "server" nil server-program)))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
181 (set-process-sentinel server-process 'server-sentinel)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
182 (set-process-filter server-process 'server-process-filter)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
183 (process-kill-without-query server-process)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
184
38da30b6253c Initial revision
root <root>
parents:
diff changeset
185 ;Process a request from the server to edit some files.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
186 ;Format of STRING is "Client: CLIENTID PATH PATH PATH... \n"
38da30b6253c Initial revision
root <root>
parents:
diff changeset
187 (defun server-process-filter (proc string)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
188 (server-log string)
138
f3f3651d2520 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 50
diff changeset
189 (setq string (concat server-previous-string string))
10281
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
190 ;; If the input is multiple lines,
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
191 ;; process each line individually.
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
192 (while (string-match "\n" string)
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
193 (let ((request (substring string 0 (match-beginning 0)))
15956
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
194 client nowait
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
195 (files nil)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
196 (lineno 1))
10281
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
197 ;; Remove this line from STRING.
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
198 (setq string (substring string (match-end 0)))
12411
884975f72dd5 (server-process-filter): Detect error messages from server.
Richard M. Stallman <rms@gnu.org>
parents: 11329
diff changeset
199 (if (string-match "^Error: " request)
14327
0df217c5842d (server-process-filter): Pass proper format string to message.
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
200 (message "Server error: %s" (substring request (match-end 0)))
12411
884975f72dd5 (server-process-filter): Detect error messages from server.
Richard M. Stallman <rms@gnu.org>
parents: 11329
diff changeset
201 (if (string-match "^Client: " request)
13070
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
202 (progn
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
203 (setq request (substring request (match-end 0)))
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
204 (setq client (list (substring request 0 (string-match " " request))))
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
205 (setq request (substring request (match-end 0)))
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
206 (while (string-match "[^ ]+ " request)
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
207 (let ((arg
16805
4b8907e5a574 (server-process-filter): Let-bind `pos'.
Richard M. Stallman <rms@gnu.org>
parents: 16789
diff changeset
208 (substring request (match-beginning 0) (1- (match-end 0))))
4b8907e5a574 (server-process-filter): Let-bind `pos'.
Richard M. Stallman <rms@gnu.org>
parents: 16789
diff changeset
209 (pos 0))
13070
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
210 (setq request (substring request (match-end 0)))
15956
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
211 (if (string-match "\\`-nowait" arg)
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
212 (setq nowait t)
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
213 (if (string-match "\\`\\+[0-9]+\\'" arg)
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
214 ;; ARG is a line number option.
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
215 (setq lineno (read (substring arg 1)))
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
216 ;; ARG is a file name.
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
217 ;; Collapse multiple slashes to single slashes.
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
218 (setq arg (command-line-normalize-file-name arg))
16060
7e6b741a8b6a (server-process-filter): Undo the quoting with
Richard M. Stallman <rms@gnu.org>
parents: 15956
diff changeset
219 ;; Undo the quoting that emacsclient does
7e6b741a8b6a (server-process-filter): Undo the quoting with
Richard M. Stallman <rms@gnu.org>
parents: 15956
diff changeset
220 ;; for certain special characters.
16075
1fd0ed653ce6 (server-process-filter): Quote with &, not \.
Richard M. Stallman <rms@gnu.org>
parents: 16060
diff changeset
221 (while (string-match "&." arg pos)
16060
7e6b741a8b6a (server-process-filter): Undo the quoting with
Richard M. Stallman <rms@gnu.org>
parents: 15956
diff changeset
222 (setq pos (1+ (match-beginning 0)))
7e6b741a8b6a (server-process-filter): Undo the quoting with
Richard M. Stallman <rms@gnu.org>
parents: 15956
diff changeset
223 (let ((nextchar (aref arg pos)))
16075
1fd0ed653ce6 (server-process-filter): Quote with &, not \.
Richard M. Stallman <rms@gnu.org>
parents: 16060
diff changeset
224 (cond ((= nextchar ?&)
1fd0ed653ce6 (server-process-filter): Quote with &, not \.
Richard M. Stallman <rms@gnu.org>
parents: 16060
diff changeset
225 (setq arg (replace-match "&" t t arg)))
16060
7e6b741a8b6a (server-process-filter): Undo the quoting with
Richard M. Stallman <rms@gnu.org>
parents: 15956
diff changeset
226 ((= nextchar ?-)
7e6b741a8b6a (server-process-filter): Undo the quoting with
Richard M. Stallman <rms@gnu.org>
parents: 15956
diff changeset
227 (setq arg (replace-match "-" t t arg)))
7e6b741a8b6a (server-process-filter): Undo the quoting with
Richard M. Stallman <rms@gnu.org>
parents: 15956
diff changeset
228 (t
7e6b741a8b6a (server-process-filter): Undo the quoting with
Richard M. Stallman <rms@gnu.org>
parents: 15956
diff changeset
229 (setq arg (replace-match " " t t arg))))))
15956
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
230 (setq files
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
231 (cons (list arg lineno)
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
232 files))
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
233 (setq lineno 1)))))
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
234 (server-visit-files files client nowait)
13070
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
235 ;; CLIENT is now a list (CLIENTNUM BUFFERS...)
15956
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
236 (or nowait
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
237 (setq server-clients (cons client server-clients)))
13070
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
238 (server-switch-buffer (nth 1 client))
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
239 (run-hooks 'server-switch-hook)
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
240 (message (substitute-command-keys
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
241 "When done with a buffer, type \\[server-edit]")))))))
10281
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
242 ;; Save for later any partial line that remains.
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
243 (setq server-previous-string string))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
244
15956
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
245 (defun server-visit-files (files client &optional nowait)
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
246 "Finds FILES and returns the list CLIENT with the buffers nconc'd.
15956
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
247 FILES is an alist whose elements are (FILENAME LINENUMBER).
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
248 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
249 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
250 ;; Bind last-nonmenu-event to force use of keyboard, not mouse, for queries.
8c8410bc0f1b (server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents: 7597
diff changeset
251 (let (client-record (last-nonmenu-event t) (obuf (current-buffer)))
4500
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
252 ;; 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
253 ;; 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
254 ;; if it happens to be one of those specified by the server.
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
255 (unwind-protect
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
256 (while files
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
257 ;; If there is an existing buffer modified or the file is modified,
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
258 ;; revert it.
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
259 ;; If there is an existing buffer with deleted file, offer to write it.
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
260 (let* ((filen (car (car files)))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
261 (obuf (get-file-buffer filen)))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
262 (if (and obuf (set-buffer obuf))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
263 (if (file-exists-p filen)
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
264 (if (or (not (verify-visited-file-modtime obuf))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
265 (buffer-modified-p obuf))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
266 (revert-buffer t nil))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
267 (if (y-or-n-p
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
268 (concat "File no longer exists: "
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
269 filen
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
270 ", write buffer to file? "))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
271 (write-file filen)))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
272 (set-buffer (find-file-noselect filen))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
273 (run-hooks 'server-visit-hook)))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
274 (goto-line (nth 1 (car files)))
15956
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
275 (if (not nowait)
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
276 (setq server-buffer-clients
0cefc98d243d (server-visit-files): New argument NOWAIT.
Richard M. Stallman <rms@gnu.org>
parents: 14717
diff changeset
277 (cons (car client) server-buffer-clients)))
4500
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
278 (setq client-record (cons (current-buffer) client-record))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
279 (setq files (cdr files)))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
280 (set-buffer obuf))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
281 (nconc client client-record)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
282
38da30b6253c Initial revision
root <root>
parents:
diff changeset
283 (defun server-buffer-done (buffer)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
284 "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
285 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
286 NEXT-BUFFER is another server buffer, as a suggestion for what to select next,
88cba63f2a9b (server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents: 10281
diff changeset
287 or nil. KILLED is t if we killed BUFFER (because it was a temp file)."
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
288 (let ((running (eq (process-status server-process) 'run))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
289 (next-buffer nil)
10961
88cba63f2a9b (server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents: 10281
diff changeset
290 (killed nil)
12822
6fb78108d62d (server-buffer-done): Pause between client commands,
Richard M. Stallman <rms@gnu.org>
parents: 12411
diff changeset
291 (first t)
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
292 (old-clients server-clients))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
293 (while old-clients
38da30b6253c Initial revision
root <root>
parents:
diff changeset
294 (let ((client (car old-clients)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
295 (or next-buffer
38da30b6253c Initial revision
root <root>
parents:
diff changeset
296 (setq next-buffer (nth 1 (memq buffer client))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
297 (delq buffer client)
10281
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
298 ;; Delete all dead buffers from CLIENT.
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
299 (let ((tail client))
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
300 (while tail
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
301 (and (bufferp (car tail))
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
302 (null (buffer-name (car tail)))
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
303 (delq (car tail) client))
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
304 (setq tail (cdr tail))))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
305 ;; If client now has no pending buffers,
38da30b6253c Initial revision
root <root>
parents:
diff changeset
306 ;; tell it that it is done, and forget it entirely.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
307 (if (cdr client) nil
38da30b6253c Initial revision
root <root>
parents:
diff changeset
308 (if running
38da30b6253c Initial revision
root <root>
parents:
diff changeset
309 (progn
12822
6fb78108d62d (server-buffer-done): Pause between client commands,
Richard M. Stallman <rms@gnu.org>
parents: 12411
diff changeset
310 ;; Don't send emacsserver two commands in close succession.
6fb78108d62d (server-buffer-done): Pause between client commands,
Richard M. Stallman <rms@gnu.org>
parents: 12411
diff changeset
311 ;; It cannot handle that.
6fb78108d62d (server-buffer-done): Pause between client commands,
Richard M. Stallman <rms@gnu.org>
parents: 12411
diff changeset
312 (or first (sit-for 1))
6fb78108d62d (server-buffer-done): Pause between client commands,
Richard M. Stallman <rms@gnu.org>
parents: 12411
diff changeset
313 (setq first nil)
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
314 (send-string server-process
38da30b6253c Initial revision
root <root>
parents:
diff changeset
315 (format "Close: %s Done\n" (car client)))
12822
6fb78108d62d (server-buffer-done): Pause between client commands,
Richard M. Stallman <rms@gnu.org>
parents: 12411
diff changeset
316 (server-log (format "Close: %s Done\n" (car client)))))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
317 (setq server-clients (delq client server-clients))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
318 (setq old-clients (cdr old-clients)))
10281
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
319 (if (and (bufferp buffer) (buffer-name buffer))
6176
1dbec303c87b (kill-emacs-query-functions, kill-buffer-query-functions):
Richard M. Stallman <rms@gnu.org>
parents: 5749
diff changeset
320 (progn
1dbec303c87b (kill-emacs-query-functions, kill-buffer-query-functions):
Richard M. Stallman <rms@gnu.org>
parents: 5749
diff changeset
321 (save-excursion
1dbec303c87b (kill-emacs-query-functions, kill-buffer-query-functions):
Richard M. Stallman <rms@gnu.org>
parents: 5749
diff changeset
322 (set-buffer buffer)
7597
99a600c67e82 (server-done-hook): New hook.
Richard M. Stallman <rms@gnu.org>
parents: 7553
diff changeset
323 (setq server-buffer-clients nil)
99a600c67e82 (server-done-hook): New hook.
Richard M. Stallman <rms@gnu.org>
parents: 7553
diff changeset
324 (run-hooks 'server-done-hook))
7553
e473c5ad9e7d (server-done): Never kill buffer here.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
325 (if (server-temp-file-p buffer)
10961
88cba63f2a9b (server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents: 10281
diff changeset
326 (progn (kill-buffer buffer)
88cba63f2a9b (server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents: 10281
diff changeset
327 (setq killed t))
7553
e473c5ad9e7d (server-done): Never kill buffer here.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
328 (bury-buffer buffer))))
10961
88cba63f2a9b (server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents: 10281
diff changeset
329 (list next-buffer killed)))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
330
38da30b6253c Initial revision
root <root>
parents:
diff changeset
331 (defun server-temp-file-p (buffer)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
332 "Return non-nil if BUFFER contains a file considered temporary.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
333 These are files whose names suggest they are repeatedly
38da30b6253c Initial revision
root <root>
parents:
diff changeset
334 reused to pass information to another program.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
335
38da30b6253c Initial revision
root <root>
parents:
diff changeset
336 The variable `server-temp-file-regexp' controls which filenames
38da30b6253c Initial revision
root <root>
parents:
diff changeset
337 are considered temporary."
38da30b6253c Initial revision
root <root>
parents:
diff changeset
338 (and (buffer-file-name buffer)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
339 (string-match server-temp-file-regexp (buffer-file-name buffer))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
340
38da30b6253c Initial revision
root <root>
parents:
diff changeset
341 (defun server-done ()
1540
f3554332993b Doc fix.
Christopher Zaborsky <rogue@erratum.com>
parents: 1079
diff changeset
342 "Offer to save current buffer, mark it as \"done\" for clients.
10961
88cba63f2a9b (server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents: 10281
diff changeset
343 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
344 NEXT-BUFFER is another server buffer, as a suggestion for what to select next,
88cba63f2a9b (server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents: 10281
diff changeset
345 or nil. KILLED is t if we killed the BUFFER (because it was a temp file)."
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
346 (let ((buffer (current-buffer)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
347 (if server-buffer-clients
7553
e473c5ad9e7d (server-done): Never kill buffer here.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
348 (progn
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
349 (if (server-temp-file-p buffer)
4096
badd80e9e4fc (server-done): Let save-buffer make the backup,
Richard M. Stallman <rms@gnu.org>
parents: 3746
diff changeset
350 ;; For a temp file, save, and do make a non-numeric backup
badd80e9e4fc (server-done): Let save-buffer make the backup,
Richard M. Stallman <rms@gnu.org>
parents: 3746
diff changeset
351 ;; (unless make-backup-files is nil).
badd80e9e4fc (server-done): Let save-buffer make the backup,
Richard M. Stallman <rms@gnu.org>
parents: 3746
diff changeset
352 (let ((version-control nil)
badd80e9e4fc (server-done): Let save-buffer make the backup,
Richard M. Stallman <rms@gnu.org>
parents: 3746
diff changeset
353 (buffer-backed-up nil))
7553
e473c5ad9e7d (server-done): Never kill buffer here.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
354 (save-buffer))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
355 (if (and (buffer-modified-p)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
356 (y-or-n-p (concat "Save file " buffer-file-name "? ")))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
357 (save-buffer buffer)))
7553
e473c5ad9e7d (server-done): Never kill buffer here.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
358 (server-buffer-done buffer)))))
6176
1dbec303c87b (kill-emacs-query-functions, kill-buffer-query-functions):
Richard M. Stallman <rms@gnu.org>
parents: 5749
diff changeset
359
9883
7c4393810151 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 9252
diff changeset
360 ;; Ask before killing a server buffer.
7c4393810151 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 9252
diff changeset
361 ;; It was suggested to release its client instead,
7c4393810151 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 9252
diff changeset
362 ;; but I think that is dangerous--the client would proceed
7c4393810151 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 9252
diff changeset
363 ;; 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
364 (defun server-kill-buffer-query-function ()
0983fe01e614 (server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents: 6960
diff changeset
365 (or (not server-buffer-clients)
0983fe01e614 (server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents: 6960
diff changeset
366 (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
367 (buffer-name (current-buffer))))))
0983fe01e614 (server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents: 6960
diff changeset
368
6176
1dbec303c87b (kill-emacs-query-functions, kill-buffer-query-functions):
Richard M. Stallman <rms@gnu.org>
parents: 5749
diff changeset
369 (add-hook 'kill-buffer-query-functions
6993
0983fe01e614 (server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents: 6960
diff changeset
370 '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
371
6993
0983fe01e614 (server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents: 6960
diff changeset
372 (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
373 (let (live-client
8c8410bc0f1b (server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents: 7597
diff changeset
374 (tail server-clients))
8c8410bc0f1b (server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents: 7597
diff changeset
375 ;; 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
376 (while tail
8c8410bc0f1b (server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents: 7597
diff changeset
377 (if (memq t (mapcar 'stringp (mapcar 'buffer-name (cdr (car tail)))))
8c8410bc0f1b (server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents: 7597
diff changeset
378 (setq live-client t))
8c8410bc0f1b (server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents: 7597
diff changeset
379 (setq tail (cdr tail)))
8c8410bc0f1b (server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents: 7597
diff changeset
380 (or (not live-client)
8c8410bc0f1b (server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents: 7597
diff changeset
381 (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
382
0983fe01e614 (server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents: 6960
diff changeset
383 (add-hook 'kill-emacs-query-functions 'server-kill-emacs-query-function)
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
384
38da30b6253c Initial revision
root <root>
parents:
diff changeset
385 (defun server-edit (&optional arg)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
386 "Switch to next server editing buffer; say \"Done\" for current buffer.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
387 If a server buffer is current, it is marked \"done\" and optionally saved.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
388 When all of a client's buffers are marked as \"done\", the client is notified.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
389
38da30b6253c Initial revision
root <root>
parents:
diff changeset
390 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
391 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
392 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
393 prevent a backup for it.) The variable `server-temp-file-regexp' controls
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
394 which filenames are considered temporary.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
395
38da30b6253c Initial revision
root <root>
parents:
diff changeset
396 If invoked with a prefix argument, or if there is no server process running,
38da30b6253c Initial revision
root <root>
parents:
diff changeset
397 starts server process and that is all. Invoked by \\[server-edit]."
38da30b6253c Initial revision
root <root>
parents:
diff changeset
398 (interactive "P")
38da30b6253c Initial revision
root <root>
parents:
diff changeset
399 (if (or arg
38da30b6253c Initial revision
root <root>
parents:
diff changeset
400 (not server-process)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
401 (memq (process-status server-process) '(signal exit)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
402 (server-start nil)
10961
88cba63f2a9b (server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents: 10281
diff changeset
403 (apply 'server-switch-buffer (server-done))))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
404
11329
ecbfde696360 (server-switch-buffer): Make first arg optional too;
Roland McGrath <roland@gnu.org>
parents: 11235
diff changeset
405 (defun server-switch-buffer (&optional next-buffer killed-one)
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
406 "Switch to another buffer, preferably one that has a client.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
407 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
408 ;; 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
409 ;; 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
410 ;; 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
411 ;; since we've already effectively done that.
10218
b78b8c445f33 (server-switch-buffer): Cope with dead frames and windows.
Richard M. Stallman <rms@gnu.org>
parents: 9883
diff changeset
412 (cond ((and (windowp server-window)
b78b8c445f33 (server-switch-buffer): Cope with dead frames and windows.
Richard M. Stallman <rms@gnu.org>
parents: 9883
diff changeset
413 (window-live-p server-window))
3661
65d530f613a8 (server-window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 2866
diff changeset
414 (select-window server-window))
65d530f613a8 (server-window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 2866
diff changeset
415 ((framep server-window)
10218
b78b8c445f33 (server-switch-buffer): Cope with dead frames and windows.
Richard M. Stallman <rms@gnu.org>
parents: 9883
diff changeset
416 (if (not (frame-live-p server-window))
b78b8c445f33 (server-switch-buffer): Cope with dead frames and windows.
Richard M. Stallman <rms@gnu.org>
parents: 9883
diff changeset
417 (setq server-window (make-frame)))
3661
65d530f613a8 (server-window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 2866
diff changeset
418 (select-window (frame-selected-window server-window))))
6182
472277144da6 (server-switch-buffer): Don't select a minibuffer.
Karl Heuer <kwzh@gnu.org>
parents: 6176
diff changeset
419 (if (window-minibuffer-p (selected-window))
9252
8c659649649e (server-switch-buffer): Don't go to an invisible frame.
Richard M. Stallman <rms@gnu.org>
parents: 8733
diff changeset
420 (select-window (next-window nil 'nomini 0)))
8c659649649e (server-switch-buffer): Don't go to an invisible frame.
Richard M. Stallman <rms@gnu.org>
parents: 8733
diff changeset
421 ;; Move to a non-dedicated window, if we have one.
8c659649649e (server-switch-buffer): Don't go to an invisible frame.
Richard M. Stallman <rms@gnu.org>
parents: 8733
diff changeset
422 (let ((last-window (previous-window nil 'nomini 0)))
8c659649649e (server-switch-buffer): Don't go to an invisible frame.
Richard M. Stallman <rms@gnu.org>
parents: 8733
diff changeset
423 (while (and (window-dedicated-p (selected-window))
8c659649649e (server-switch-buffer): Don't go to an invisible frame.
Richard M. Stallman <rms@gnu.org>
parents: 8733
diff changeset
424 (not (eq last-window (selected-window))))
8c659649649e (server-switch-buffer): Don't go to an invisible frame.
Richard M. Stallman <rms@gnu.org>
parents: 8733
diff changeset
425 (select-window (next-window nil 'nomini 0))))
8c659649649e (server-switch-buffer): Don't go to an invisible frame.
Richard M. Stallman <rms@gnu.org>
parents: 8733
diff changeset
426 (set-window-dedicated-p (selected-window) nil)
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
427 (if next-buffer
38da30b6253c Initial revision
root <root>
parents:
diff changeset
428 (if (and (bufferp next-buffer)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
429 (buffer-name next-buffer))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
430 (switch-to-buffer next-buffer)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
431 ;; If NEXT-BUFFER is a dead buffer,
38da30b6253c Initial revision
root <root>
parents:
diff changeset
432 ;; remove the server records for it
38da30b6253c Initial revision
root <root>
parents:
diff changeset
433 ;; and try the next surviving server buffer.
10961
88cba63f2a9b (server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents: 10281
diff changeset
434 (apply 'server-switch-buffer
88cba63f2a9b (server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents: 10281
diff changeset
435 (server-buffer-done next-buffer)))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
436 (if server-clients
10961
88cba63f2a9b (server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents: 10281
diff changeset
437 (server-switch-buffer (nth 1 (car server-clients)) killed-one)
88cba63f2a9b (server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents: 10281
diff changeset
438 (if (not killed-one)
88cba63f2a9b (server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents: 10281
diff changeset
439 (switch-to-buffer (other-buffer))))))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
440
38da30b6253c Initial revision
root <root>
parents:
diff changeset
441 (global-set-key "\C-x#" 'server-edit)
1079
0c960257c363 entered into RCS
Roland McGrath <roland@gnu.org>
parents: 844
diff changeset
442
0c960257c363 entered into RCS
Roland McGrath <roland@gnu.org>
parents: 844
diff changeset
443 (provide 'server)
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 445
diff changeset
444
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 445
diff changeset
445 ;;; server.el ends here