gore@ODDJOB.UCHICAGO.EDU (Jacob Gore) (10/08/88)
These are some changes that I think should be made in server.el for the next release (we are using them locally now): 1. Addition of server-mode-hook; 2. An easy way to have client buffers deleted automatically when the client is done; 3. Some clarifications in the comments. Change #1 does not seem controversial at all -- I was very surprised that there was no such hook. For example, I use it to select a default major mode other than Fundamental, and to locally bind server-edit to C-x C-c instead of C-x #. Change #2 is suggested for three reasons: 1. Aesthetic: if you use the server frequently on different files (especially from a program that likes to edit temporary files), your buffer list gets cluttered with old client buffers that will eventually be deleted by hand anyway. 2. It allows you to emulate a "start-for-every-file" type editor more accurately: the question of whether a buffer needs to be reverted or not does not come into play at all -- very convenient in cases where the client program calls emacsclient on a temp-file, then modifies that temp-file, then calls emacsclient on it again. 3. It is a trivial change (not a reason in itself, but...). Change #3 should be studied by somebody who works on non-4.2BSD environment. I *think* that my comments are more accurate, but I can see that they may not be portable -- especially one about running server on one terminal and client on another. Also, it's not my place to add 1988 to the Copyright notice, but I did it as long as I was at it... Jacob Gore Gore@EECS.NWU.Edu Northwestern Univ., EECS Dept. {oddjob,gargoyle,att}!nucsrl!gore (This patch should be applied to server.el of 18.52.) *** /usr/local/lib/emacs/lisp/server.el Thu Aug 4 18:38:06 1988 --- server.el Fri Oct 7 12:39:55 1988 *************** *** 1,5 **** ;; Lisp code for GNU Emacs running as server process. ! ;; Copyright (C) 1986, 1987 Free Software Foundation, Inc. ;; Author William Sommerfeld, wesommer@athena.mit.edu. ;; Changes by peck@sun.com and by rms. --- 1,5 ---- ;; Lisp code for GNU Emacs running as server process. ! ;; Copyright (C) 1986, 1987, 1988 Free Software Foundation, Inc. ;; Author William Sommerfeld, wesommer@athena.mit.edu. ;; Changes by peck@sun.com and by rms. *************** *** 45,63 **** ;;; Your editing commands and Emacs's display output go to and from ;;; the terminal in the usual way. Thus, server operation is possible ;;; only when Emacs can talk to the terminal at the time you invoke ! ;;; the client. This is possible in two cases: ;;; 1. On a window system, where Emacs runs in one window and the ;;; program that wants to use "the editor" runs in another. ! ;;; 2. When the program that wants to use "the editor" is running ;;; as a subprocess of Emacs. ;;; The buffer local variable "server-buffer-clients" lists ;;; the clients who are waiting for this buffer to be edited. ;;; The global variable "server-clients" lists all the waiting clients, ;;; and which files are yet to be edited for each. (defvar server-program "server" "*The program to use as the edit server") --- 45,84 ---- ;;; Your editing commands and Emacs's display output go to and from ;;; the terminal in the usual way. Thus, server operation is possible ;;; only when Emacs can talk to the terminal at the time you invoke ! ;;; the client. This is possible in four cases: ;;; 1. On a window system, where Emacs runs in one window and the ;;; program that wants to use "the editor" runs in another. ! ;;; 2. On a multi-terminal system, where Emacs runs on one terminal and the ! ;;; program that wants to use "the editor" runs on another. ! ! ;;; 3. When the program that wants to use "the editor" is running ;;; as a subprocess of Emacs. + ;;; 4. On a system with job control, when Emacs is suspended, the program + ;;; that wants to use "the editor" will stop and display + ;;; "Waiting for Emacs...". It can then be suspended, and Emacs can be + ;;; brought into the foreground for editing. When done editing, Emacs is + ;;; suspended again, and the client program is brought into the foreground. + ;;; The buffer local variable "server-buffer-clients" lists ;;; the clients who are waiting for this buffer to be edited. + ;;; The global variable "server-clients" lists all the waiting clients, ;;; and which files are yet to be edited for each. + + ;;; If the global variable "server-kill-buffers-when-done" is non-nil, + ;;; the buffer in which the client editing was performed is deleted. + ;;; This can be used for general housekeeping purposes. It is also + ;;; useful when the client program frequently edits the file that Emacs + ;;; edits too -- it avoids the guesswork about whether the buffer needs + ;;; to be reverted or not. + (defconst server-kill-buffers-when-done nil + "*If non-nil, every \"Done\" buffer is deleted + after it is passed back to the client.") + (defvar server-program "server" "*The program to use as the edit server") *************** *** 147,152 **** --- 168,175 ---- ;; CLIENT is now a list (CLIENTNUM BUFFERS...) (setq server-clients (cons client server-clients)) (switch-to-buffer (nth 1 client)) + ;; Call hook here in case it redefines \[server-edit]. + (run-hooks 'server-mode-hook) (message (substitute-command-keys "When done with a buffer, type \\[server-edit]."))))) *************** *** 204,210 **** (save-excursion (set-buffer buffer) (setq server-buffer-clients nil))) ! (bury-buffer buffer) next-buffer)) (defun mh-draft-p (buffer) --- 227,235 ---- (save-excursion (set-buffer buffer) (setq server-buffer-clients nil))) ! (if server-kill-buffers-when-done ! (kill-buffer buffer) ! (bury-buffer buffer)) next-buffer)) (defun mh-draft-p (buffer)