annotate lisp/server.el @ 14789:d68b71228abd

(bibtex-pop): New generic function which unifies the functionality of bibtex-pop-previous and bibtex-pop-next. Now, bibtex-pop moves to the end of field after the pop. Concatenated strings are now handled correctly. Delimiters are not added to non-delimited entries. Changed occurences of bibtex-text-in-cfield to bibtex-text-in-field. (bibtex-pop-previous, bibtex-pop-next): Call bibtex-pop. (bibtex-complete-string): Fixed bug that removed delimiters around the following field if current field is already undelimited on completion. (bibtex-complete-string, bibtex-remove-double-quotes-or-braces): Only remove delimiters if field text is not concatenated. (bibtex-font-lock-keywords): Use the same regexps used in all other places of bibtex.el to parse the buffer. (bibtex-mode): Changed the definition of font-lock-defaults, so that quote-delimited entries aren't fontified as strings anymore. (bibtex-parse-keys): Changed the regexp used for finding crossref entries. (bibtex-field-const, bibtex-reference-key): Fixed the regexp to match more of the characters allowed here by BibTeX/LaTeX. (bibtex-field-name): Made it less restrictive. (bibtex-field-string): Changed so that quote-delimited entries with quotes inside aren't a problem anymore. Changed nesting level of braces in entries to support three inner braces. (bibtex-validate-buffer): By giving an optional argument, the user can now let it not validate the whole buffer, but only the portion starting at point. Small modification in strategy used to find next entry. (bibtex-print-help-message): Ignore case in field name when searching for help text. (bibtex-submit-bug-report): New function.
author Richard M. Stallman <rms@gnu.org>
date Fri, 08 Mar 1996 17:42:30 +0000
parents e299e3e3cf9d
children 0cefc98d243d
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))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
150 (condition-case () (delete-file "~/.emacs_server") (error nil))
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 ()
31242cebf1d3 (server-start): Try both full hostname and shortened
Richard M. Stallman <rms@gnu.org>
parents: 13070
diff changeset
154 (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
155 (error nil))
31242cebf1d3 (server-start): Try both full hostname and shortened
Richard M. Stallman <rms@gnu.org>
parents: 13070
diff changeset
156 ;; 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
157 ;; try deleting that name too.
31242cebf1d3 (server-start): Try both full hostname and shortened
Richard M. Stallman <rms@gnu.org>
parents: 13070
diff changeset
158 (if dot-index
31242cebf1d3 (server-start): Try both full hostname and shortened
Richard M. Stallman <rms@gnu.org>
parents: 13070
diff changeset
159 (condition-case ()
31242cebf1d3 (server-start): Try both full hostname and shortened
Richard M. Stallman <rms@gnu.org>
parents: 13070
diff changeset
160 (delete-file (format "/tmp/esrv%d-%s" (user-uid)
31242cebf1d3 (server-start): Try both full hostname and shortened
Richard M. Stallman <rms@gnu.org>
parents: 13070
diff changeset
161 (substring sysname 0 dot-index)))
31242cebf1d3 (server-start): Try both full hostname and shortened
Richard M. Stallman <rms@gnu.org>
parents: 13070
diff changeset
162 (error nil))))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
163 ;; If we already had a server, clear out associated status.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
164 (while server-clients
38da30b6253c Initial revision
root <root>
parents:
diff changeset
165 (let ((buffer (nth 1 (car server-clients))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
166 (server-buffer-done buffer)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
167 (if leave-dead
38da30b6253c Initial revision
root <root>
parents:
diff changeset
168 nil
38da30b6253c Initial revision
root <root>
parents:
diff changeset
169 (if server-process
38da30b6253c Initial revision
root <root>
parents:
diff changeset
170 (server-log (message "Restarting server")))
8733
14b8f8a28ace (server-start): Always use pipes for communication.
Richard M. Stallman <rms@gnu.org>
parents: 8202
diff changeset
171 ;; 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
172 ;; 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
173 (let ((process-connection-type nil))
14b8f8a28ace (server-start): Always use pipes for communication.
Richard M. Stallman <rms@gnu.org>
parents: 8202
diff changeset
174 (setq server-process (start-process "server" nil server-program)))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
175 (set-process-sentinel server-process 'server-sentinel)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
176 (set-process-filter server-process 'server-process-filter)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
177 (process-kill-without-query server-process)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
178
38da30b6253c Initial revision
root <root>
parents:
diff changeset
179 ;Process a request from the server to edit some files.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
180 ;Format of STRING is "Client: CLIENTID PATH PATH PATH... \n"
38da30b6253c Initial revision
root <root>
parents:
diff changeset
181 (defun server-process-filter (proc string)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
182 (server-log string)
138
f3f3651d2520 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 50
diff changeset
183 (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
184 ;; If the input is multiple lines,
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
185 ;; process each line individually.
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
186 (while (string-match "\n" string)
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
187 (let ((request (substring string 0 (match-beginning 0)))
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
188 client
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
189 (files nil)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
190 (lineno 1))
10281
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
191 ;; Remove this line from STRING.
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
192 (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
193 (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
194 (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
195 (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
196 (progn
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
197 (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
198 (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
199 (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
200 (while (string-match "[^ ]+ " request)
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
201 (let ((arg
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
202 (substring request (match-beginning 0) (1- (match-end 0)))))
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 (if (string-match "\\`\\+[0-9]+\\'" arg)
14385
aa3232e9077f (server-process-filter): In file name, collapse multiple slashes to one.
Richard M. Stallman <rms@gnu.org>
parents: 14327
diff changeset
205 ;; ARG is a line number option.
13070
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
206 (setq lineno (read (substring arg 1)))
14385
aa3232e9077f (server-process-filter): In file name, collapse multiple slashes to one.
Richard M. Stallman <rms@gnu.org>
parents: 14327
diff changeset
207 ;; ARG is a file name.
14717
e299e3e3cf9d (server-process-filter): Use command-line-normalize-file-name.
Richard M. Stallman <rms@gnu.org>
parents: 14702
diff changeset
208 ;; Collapse multiple slashes to single slashes.
e299e3e3cf9d (server-process-filter): Use command-line-normalize-file-name.
Richard M. Stallman <rms@gnu.org>
parents: 14702
diff changeset
209 (setq arg (command-line-normalize-file-name arg))
13070
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
210 (setq files
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
211 (cons (list arg lineno)
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
212 files))
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
213 (setq lineno 1))))
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
214 (server-visit-files files client)
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
215 ;; CLIENT is now a list (CLIENTNUM BUFFERS...)
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
216 (setq server-clients (cons client server-clients))
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
217 (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
218 (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
219 (message (substitute-command-keys
c668502d5a93 (server-process-filter): Ignore lines that don't start
Richard M. Stallman <rms@gnu.org>
parents: 12822
diff changeset
220 "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
221 ;; 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
222 (setq server-previous-string string))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
223
38da30b6253c Initial revision
root <root>
parents:
diff changeset
224 (defun server-visit-files (files client)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
225 "Finds FILES and returns the list CLIENT with the buffers nconc'd.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
226 FILES is an alist whose elements are (FILENAME LINENUMBER)."
7736
8c8410bc0f1b (server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents: 7597
diff changeset
227 ;; 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
228 (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
229 ;; 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
230 ;; 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
231 ;; 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
232 (unwind-protect
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
233 (while files
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
234 ;; 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
235 ;; revert it.
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
236 ;; 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
237 (let* ((filen (car (car files)))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
238 (obuf (get-file-buffer filen)))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
239 (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
240 (if (file-exists-p filen)
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
241 (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
242 (buffer-modified-p obuf))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
243 (revert-buffer t nil))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
244 (if (y-or-n-p
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
245 (concat "File no longer exists: "
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
246 filen
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
247 ", write buffer to file? "))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
248 (write-file filen)))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
249 (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
250 (run-hooks 'server-visit-hook)))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
251 (goto-line (nth 1 (car files)))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
252 (setq server-buffer-clients (cons (car client) server-buffer-clients))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
253 (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
254 (setq files (cdr files)))
56d7c4beae9f (server-visit-files): Restore current-buffer by hand,
Richard M. Stallman <rms@gnu.org>
parents: 4096
diff changeset
255 (set-buffer obuf))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
256 (nconc client client-record)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
257
38da30b6253c Initial revision
root <root>
parents:
diff changeset
258 (defun server-buffer-done (buffer)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
259 "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
260 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
261 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
262 or nil. KILLED is t if we killed BUFFER (because it was a temp file)."
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
263 (let ((running (eq (process-status server-process) 'run))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
264 (next-buffer nil)
10961
88cba63f2a9b (server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents: 10281
diff changeset
265 (killed nil)
12822
6fb78108d62d (server-buffer-done): Pause between client commands,
Richard M. Stallman <rms@gnu.org>
parents: 12411
diff changeset
266 (first t)
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
267 (old-clients server-clients))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
268 (while old-clients
38da30b6253c Initial revision
root <root>
parents:
diff changeset
269 (let ((client (car old-clients)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
270 (or next-buffer
38da30b6253c Initial revision
root <root>
parents:
diff changeset
271 (setq next-buffer (nth 1 (memq buffer client))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
272 (delq buffer client)
10281
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
273 ;; Delete all dead buffers from CLIENT.
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
274 (let ((tail client))
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
275 (while tail
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
276 (and (bufferp (car tail))
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
277 (null (buffer-name (car tail)))
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
278 (delq (car tail) client))
44d98e169823 (server-process-filter): Process each line separately.
Richard M. Stallman <rms@gnu.org>
parents: 10218
diff changeset
279 (setq tail (cdr tail))))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
280 ;; If client now has no pending buffers,
38da30b6253c Initial revision
root <root>
parents:
diff changeset
281 ;; tell it that it is done, and forget it entirely.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
282 (if (cdr client) nil
38da30b6253c Initial revision
root <root>
parents:
diff changeset
283 (if running
38da30b6253c Initial revision
root <root>
parents:
diff changeset
284 (progn
12822
6fb78108d62d (server-buffer-done): Pause between client commands,
Richard M. Stallman <rms@gnu.org>
parents: 12411
diff changeset
285 ;; 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
286 ;; It cannot handle that.
6fb78108d62d (server-buffer-done): Pause between client commands,
Richard M. Stallman <rms@gnu.org>
parents: 12411
diff changeset
287 (or first (sit-for 1))
6fb78108d62d (server-buffer-done): Pause between client commands,
Richard M. Stallman <rms@gnu.org>
parents: 12411
diff changeset
288 (setq first nil)
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
289 (send-string server-process
38da30b6253c Initial revision
root <root>
parents:
diff changeset
290 (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
291 (server-log (format "Close: %s Done\n" (car client)))))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
292 (setq server-clients (delq client server-clients))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
293 (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
294 (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
295 (progn
1dbec303c87b (kill-emacs-query-functions, kill-buffer-query-functions):
Richard M. Stallman <rms@gnu.org>
parents: 5749
diff changeset
296 (save-excursion
1dbec303c87b (kill-emacs-query-functions, kill-buffer-query-functions):
Richard M. Stallman <rms@gnu.org>
parents: 5749
diff changeset
297 (set-buffer buffer)
7597
99a600c67e82 (server-done-hook): New hook.
Richard M. Stallman <rms@gnu.org>
parents: 7553
diff changeset
298 (setq server-buffer-clients nil)
99a600c67e82 (server-done-hook): New hook.
Richard M. Stallman <rms@gnu.org>
parents: 7553
diff changeset
299 (run-hooks 'server-done-hook))
7553
e473c5ad9e7d (server-done): Never kill buffer here.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
300 (if (server-temp-file-p buffer)
10961
88cba63f2a9b (server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents: 10281
diff changeset
301 (progn (kill-buffer buffer)
88cba63f2a9b (server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents: 10281
diff changeset
302 (setq killed t))
7553
e473c5ad9e7d (server-done): Never kill buffer here.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
303 (bury-buffer buffer))))
10961
88cba63f2a9b (server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents: 10281
diff changeset
304 (list next-buffer killed)))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
305
38da30b6253c Initial revision
root <root>
parents:
diff changeset
306 (defun server-temp-file-p (buffer)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
307 "Return non-nil if BUFFER contains a file considered temporary.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
308 These are files whose names suggest they are repeatedly
38da30b6253c Initial revision
root <root>
parents:
diff changeset
309 reused to pass information to another program.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
310
38da30b6253c Initial revision
root <root>
parents:
diff changeset
311 The variable `server-temp-file-regexp' controls which filenames
38da30b6253c Initial revision
root <root>
parents:
diff changeset
312 are considered temporary."
38da30b6253c Initial revision
root <root>
parents:
diff changeset
313 (and (buffer-file-name buffer)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
314 (string-match server-temp-file-regexp (buffer-file-name buffer))))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
315
38da30b6253c Initial revision
root <root>
parents:
diff changeset
316 (defun server-done ()
1540
f3554332993b Doc fix.
Christopher Zaborsky <rogue@erratum.com>
parents: 1079
diff changeset
317 "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
318 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
319 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
320 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
321 (let ((buffer (current-buffer)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
322 (if server-buffer-clients
7553
e473c5ad9e7d (server-done): Never kill buffer here.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
323 (progn
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
324 (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
325 ;; 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
326 ;; (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
327 (let ((version-control nil)
badd80e9e4fc (server-done): Let save-buffer make the backup,
Richard M. Stallman <rms@gnu.org>
parents: 3746
diff changeset
328 (buffer-backed-up nil))
7553
e473c5ad9e7d (server-done): Never kill buffer here.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
329 (save-buffer))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
330 (if (and (buffer-modified-p)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
331 (y-or-n-p (concat "Save file " buffer-file-name "? ")))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
332 (save-buffer buffer)))
7553
e473c5ad9e7d (server-done): Never kill buffer here.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
333 (server-buffer-done buffer)))))
6176
1dbec303c87b (kill-emacs-query-functions, kill-buffer-query-functions):
Richard M. Stallman <rms@gnu.org>
parents: 5749
diff changeset
334
9883
7c4393810151 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 9252
diff changeset
335 ;; Ask before killing a server buffer.
7c4393810151 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 9252
diff changeset
336 ;; It was suggested to release its client instead,
7c4393810151 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 9252
diff changeset
337 ;; but I think that is dangerous--the client would proceed
7c4393810151 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 9252
diff changeset
338 ;; 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
339 (defun server-kill-buffer-query-function ()
0983fe01e614 (server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents: 6960
diff changeset
340 (or (not server-buffer-clients)
0983fe01e614 (server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents: 6960
diff changeset
341 (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
342 (buffer-name (current-buffer))))))
0983fe01e614 (server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents: 6960
diff changeset
343
6176
1dbec303c87b (kill-emacs-query-functions, kill-buffer-query-functions):
Richard M. Stallman <rms@gnu.org>
parents: 5749
diff changeset
344 (add-hook 'kill-buffer-query-functions
6993
0983fe01e614 (server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents: 6960
diff changeset
345 '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
346
6993
0983fe01e614 (server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents: 6960
diff changeset
347 (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
348 (let (live-client
8c8410bc0f1b (server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents: 7597
diff changeset
349 (tail server-clients))
8c8410bc0f1b (server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents: 7597
diff changeset
350 ;; 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
351 (while tail
8c8410bc0f1b (server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents: 7597
diff changeset
352 (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
353 (setq live-client t))
8c8410bc0f1b (server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents: 7597
diff changeset
354 (setq tail (cdr tail)))
8c8410bc0f1b (server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents: 7597
diff changeset
355 (or (not live-client)
8c8410bc0f1b (server-visit-files): Bind last-nonmenu-event.
Richard M. Stallman <rms@gnu.org>
parents: 7597
diff changeset
356 (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
357
0983fe01e614 (server-kill-emacs-query-function)
Richard M. Stallman <rms@gnu.org>
parents: 6960
diff changeset
358 (add-hook 'kill-emacs-query-functions 'server-kill-emacs-query-function)
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
359
38da30b6253c Initial revision
root <root>
parents:
diff changeset
360 (defun server-edit (&optional arg)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
361 "Switch to next server editing buffer; say \"Done\" for current buffer.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
362 If a server buffer is current, it is marked \"done\" and optionally saved.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
363 When all of a client's buffers are marked as \"done\", the client is notified.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
364
38da30b6253c Initial revision
root <root>
parents:
diff changeset
365 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
366 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
367 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
368 prevent a backup for it.) The variable `server-temp-file-regexp' controls
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
369 which filenames are considered temporary.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
370
38da30b6253c Initial revision
root <root>
parents:
diff changeset
371 If invoked with a prefix argument, or if there is no server process running,
38da30b6253c Initial revision
root <root>
parents:
diff changeset
372 starts server process and that is all. Invoked by \\[server-edit]."
38da30b6253c Initial revision
root <root>
parents:
diff changeset
373 (interactive "P")
38da30b6253c Initial revision
root <root>
parents:
diff changeset
374 (if (or arg
38da30b6253c Initial revision
root <root>
parents:
diff changeset
375 (not server-process)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
376 (memq (process-status server-process) '(signal exit)))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
377 (server-start nil)
10961
88cba63f2a9b (server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents: 10281
diff changeset
378 (apply 'server-switch-buffer (server-done))))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
379
11329
ecbfde696360 (server-switch-buffer): Make first arg optional too;
Roland McGrath <roland@gnu.org>
parents: 11235
diff changeset
380 (defun server-switch-buffer (&optional next-buffer killed-one)
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
381 "Switch to another buffer, preferably one that has a client.
38da30b6253c Initial revision
root <root>
parents:
diff changeset
382 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
383 ;; 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
384 ;; 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
385 ;; 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
386 ;; 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
387 (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
388 (window-live-p server-window))
3661
65d530f613a8 (server-window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 2866
diff changeset
389 (select-window server-window))
65d530f613a8 (server-window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 2866
diff changeset
390 ((framep server-window)
10218
b78b8c445f33 (server-switch-buffer): Cope with dead frames and windows.
Richard M. Stallman <rms@gnu.org>
parents: 9883
diff changeset
391 (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
392 (setq server-window (make-frame)))
3661
65d530f613a8 (server-window): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 2866
diff changeset
393 (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
394 (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
395 (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
396 ;; 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
397 (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
398 (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
399 (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
400 (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
401 (set-window-dedicated-p (selected-window) nil)
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
402 (if next-buffer
38da30b6253c Initial revision
root <root>
parents:
diff changeset
403 (if (and (bufferp next-buffer)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
404 (buffer-name next-buffer))
38da30b6253c Initial revision
root <root>
parents:
diff changeset
405 (switch-to-buffer next-buffer)
38da30b6253c Initial revision
root <root>
parents:
diff changeset
406 ;; If NEXT-BUFFER is a dead buffer,
38da30b6253c Initial revision
root <root>
parents:
diff changeset
407 ;; remove the server records for it
38da30b6253c Initial revision
root <root>
parents:
diff changeset
408 ;; 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
409 (apply 'server-switch-buffer
88cba63f2a9b (server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents: 10281
diff changeset
410 (server-buffer-done next-buffer)))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
411 (if server-clients
10961
88cba63f2a9b (server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents: 10281
diff changeset
412 (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
413 (if (not killed-one)
88cba63f2a9b (server-buffer-done): Return a list
Richard M. Stallman <rms@gnu.org>
parents: 10281
diff changeset
414 (switch-to-buffer (other-buffer))))))
50
38da30b6253c Initial revision
root <root>
parents:
diff changeset
415
38da30b6253c Initial revision
root <root>
parents:
diff changeset
416 (global-set-key "\C-x#" 'server-edit)
1079
0c960257c363 entered into RCS
Roland McGrath <roland@gnu.org>
parents: 844
diff changeset
417
0c960257c363 entered into RCS
Roland McGrath <roland@gnu.org>
parents: 844
diff changeset
418 (provide 'server)
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 445
diff changeset
419
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 445
diff changeset
420 ;;; server.el ends here