Mercurial > emacs
annotate lisp/resume.el @ 5020:94de08fd8a7c
(Fnext_single_property_change): Fix missing \n\.
| author | Richard M. Stallman <rms@gnu.org> |
|---|---|
| date | Mon, 15 Nov 1993 06:41:45 +0000 |
| parents | 62b0d90a62e8 |
| children | ad1c04ef7695 |
| rev | line source |
|---|---|
|
658
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
244
diff
changeset
|
1 ;;; resume.el --- process command line args from within a suspended Emacs job |
|
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
244
diff
changeset
|
2 |
| 845 | 3 ;; Copyright (C) 1992 Free Software Foundation, Inc. |
| 4 | |
|
810
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
5 ;; Author: Joe Wells <jbw@bucsf.bu.edu> |
|
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
6 ;; Adapted-By: ESR |
|
814
38b2499cb3e9
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
810
diff
changeset
|
7 ;; Keywords: processes |
|
810
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
8 |
|
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
9 ;; This file is part of GNU Emacs. |
|
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
10 |
|
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
11 ;; GNU Emacs is free software; you can redistribute it and/or modify |
|
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
12 ;; it under the terms of the GNU General Public License as published by |
|
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
13 ;; the Free Software Foundation; either version 1, or (at your option) |
|
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
14 ;; any later version. |
| 17 | 15 |
| 16 ;; GNU Emacs is distributed in the hope that it will be useful, | |
|
810
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
19 ;; GNU General Public License for more details. |
|
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
20 |
|
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
21 ;; You should have received a copy of the GNU General Public License |
|
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
22 ;; along with GNU Emacs; see the file COPYING. If not, write to |
|
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
23 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. |
| 17 | 24 |
|
810
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
25 ;;; Commentary: |
| 17 | 26 |
|
810
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
27 ;; Theory: the first time you start Emacs, command line arguments are |
|
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
28 ;; handled normally. Then, you suspend your emacs job. When you want to edit |
|
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
29 ;; something else, you type "emacs filename" as usual, but instead of |
|
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
30 ;; starting a new emacs job, the old job is resumed instead, and the command |
|
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
31 ;; line arguments are placed in a file where the old emacs job looks for |
|
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
32 ;; them. |
| 82 | 33 |
|
810
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
34 ;; Stephan Gildea suggested bug fix (gildea@bbn.com). |
| 17 | 35 ;; Ideas from Michael DeCorte and other people. |
| 36 | |
| 37 ;; For csh users, insert the following alias in your .cshrc file | |
| 82 | 38 ;; (after removing the leading double semicolons, of course): |
| 17 | 39 ;; |
| 82 | 40 ;;# The following line could be just EMACS_CMD=emacs, but this depends on |
| 17 | 41 ;;# your site. |
| 82 | 42 ;;if (! $?EMACS_CMD) set EMACS_CMD=emacs |
| 43 ;;set JOBS_FILE=/tmp/jobs.$USER.$$ | |
| 44 ;;set ARGS_FILE=~/.emacs_args | |
| 45 ;;set STOP_PATT='^\[[0-9]*\] *[ +-] Stopped ............ ' | |
| 46 ;;set SUNVIEW_CMD='emacstool -nw -f emacstool-init -f server-start' | |
| 47 ;;set X_CMD=\'\''$EMACS_CMD -i -f server-start' | |
| 17 | 48 ;;alias emacs \ |
| 49 ;;' \\ | |
| 82 | 50 ;; jobs >! "$JOBS_FILE" \\ |
| 51 ;; && grep "$STOP_PATT$EMACS_CMD" "$JOBS_FILE" >& /dev/null \\ | |
| 52 ;; && echo `pwd` \!* >! "$ARGS_FILE" && ""fg %$EMACS_CMD \\ | |
| 53 ;;|| if (! -e ~/.emacs_server || -f ~/.emacs_server) set status=1 \\ | |
| 54 ;; && emacsclient \!* \\ | |
| 55 ;;|| @ status=1 - $?DISPLAY && eval "$X_CMD -i \!* &" \\ | |
| 56 ;;|| @ status=1 - $?WINDOW_PARENT && eval "$SUNVIEW_CMD \!* &" \\ | |
| 57 ;;|| ""$EMACS_CMD -nw \!* \\ | |
| 58 ;;' | |
| 17 | 59 ;; |
| 60 ;; The alias works as follows: | |
| 82 | 61 ;; 1. If there is a suspended Emacs job that is a child of the |
| 17 | 62 ;; current shell, place its arguments in the ~/.emacs_args file and |
| 63 ;; resume it. | |
| 64 ;; 2. Else if the ~/.emacs_server socket has been created, presume an | |
| 82 | 65 ;; Emacs server is running and attempt to connect to it. If no Emacs |
| 17 | 66 ;; server is listening on the socket, this will fail. |
| 67 ;; 3. Else if the DISPLAY environment variable is set, presume we are | |
| 82 | 68 ;; running under X Windows and start a new GNU Emacs process in the |
| 69 ;; background as an X client. | |
| 17 | 70 ;; 4. Else if the WINDOW_PARENT environment variable is set, presume we |
| 82 | 71 ;; are running under SunView and start an emacstool process in the |
| 72 ;; background. | |
| 73 ;; 5. Else start a regular Emacs process. | |
| 17 | 74 ;; |
| 75 ;; Notes: | |
| 76 ;; The output of the "jobs" command is not piped directly into "grep" | |
| 77 ;; because that would run the "jobs" command in a subshell. | |
| 78 ;; Before resuming a suspended emacs, the current directory and all | |
| 82 | 79 ;; command line arguments are placed in a file name ~/.emacs_args. |
| 80 ;; The "-nw" switch to Emacs means no windowing system. | |
| 17 | 81 |
| 82 | 82 ;; Insert this in your .emacs file: |
|
2537
62b0d90a62e8
(resume-suspend-hook): Renamed from resume-empty-args-file.
Richard M. Stallman <rms@gnu.org>
parents:
2536
diff
changeset
|
83 ;;(add-hook 'suspend-hook 'resume-suspend-hook) |
| 82 | 84 |
| 85 ;; Finally, put the rest in a file named "resume.el" in a lisp library | |
| 86 ;; directory. | |
| 87 | |
|
810
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
88 ;;; Code: |
|
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
664
diff
changeset
|
89 |
|
2536
e8426c217792
(resume-empty-args-file): Renamed from empty-args-file.
Richard M. Stallman <rms@gnu.org>
parents:
2110
diff
changeset
|
90 (defvar resume-emacs-args-file (expand-file-name "~/.emacs_args") |
| 17 | 91 "*This file is where arguments are placed for a suspended emacs job.") |
| 92 | |
|
2536
e8426c217792
(resume-empty-args-file): Renamed from empty-args-file.
Richard M. Stallman <rms@gnu.org>
parents:
2110
diff
changeset
|
93 (defvar resume-emacs-args-buffer " *Command Line Args*" |
| 82 | 94 "Buffer that is used by resume-process-args.") |
| 17 | 95 |
| 96 (defun resume-process-args () | |
|
2536
e8426c217792
(resume-empty-args-file): Renamed from empty-args-file.
Richard M. Stallman <rms@gnu.org>
parents:
2110
diff
changeset
|
97 "Handler for command line args given when Emacs is resumed." |
| 82 | 98 (let ((start-buffer (current-buffer)) |
|
2536
e8426c217792
(resume-empty-args-file): Renamed from empty-args-file.
Richard M. Stallman <rms@gnu.org>
parents:
2110
diff
changeset
|
99 (args-buffer (get-buffer-create resume-emacs-args-buffer)) |
| 82 | 100 length args) |
| 17 | 101 (unwind-protect |
| 102 (progn | |
| 82 | 103 (set-buffer args-buffer) |
| 17 | 104 (erase-buffer) |
|
2536
e8426c217792
(resume-empty-args-file): Renamed from empty-args-file.
Richard M. Stallman <rms@gnu.org>
parents:
2110
diff
changeset
|
105 ;; get the contents of resume-emacs-args-file |
| 17 | 106 (condition-case () |
|
2536
e8426c217792
(resume-empty-args-file): Renamed from empty-args-file.
Richard M. Stallman <rms@gnu.org>
parents:
2110
diff
changeset
|
107 (let ((result (insert-file-contents resume-emacs-args-file))) |
| 82 | 108 (setq length (car (cdr result)))) |
| 109 ;; the file doesn't exist, ergo no arguments | |
| 110 (file-error | |
| 111 (erase-buffer) | |
| 112 (setq length 0))) | |
| 113 (if (<= length 0) | |
| 114 (setq args nil) | |
| 115 ;; get the arguments from the buffer | |
| 116 (goto-char (point-min)) | |
| 117 (while (not (eobp)) | |
| 118 (skip-chars-forward " \t\n") | |
| 119 (let ((begin (point))) | |
| 120 (skip-chars-forward "^ \t\n") | |
| 121 (setq args (cons (buffer-substring begin (point)) args))) | |
| 122 (skip-chars-forward " \t\n")) | |
| 123 ;; arguments are now in reverse order | |
| 124 (setq args (nreverse args)) | |
| 125 ;; make sure they're not read again | |
| 126 (erase-buffer)) | |
|
2536
e8426c217792
(resume-empty-args-file): Renamed from empty-args-file.
Richard M. Stallman <rms@gnu.org>
parents:
2110
diff
changeset
|
127 (resume-write-buffer-to-file (current-buffer) resume-emacs-args-file) |
| 82 | 128 ;; if nothing was in buffer, args will be null |
| 129 (or (null args) | |
| 130 (setq default-directory (file-name-as-directory (car args)) | |
| 131 args (cdr args))) | |
| 132 ;; actually process the arguments | |
| 133 (command-line-1 args)) | |
| 17 | 134 ;; If the command line args don't result in a find-file, the |
| 82 | 135 ;; buffer will be left in args-buffer. So we change back to the |
| 17 | 136 ;; original buffer. The reason I don't just use |
| 137 ;; (let ((default-directory foo)) | |
| 138 ;; (command-line-1 args)) | |
| 139 ;; in the context of the original buffer is because let does not | |
| 140 ;; work properly with buffer-local variables. | |
| 82 | 141 (if (eq (current-buffer) args-buffer) |
| 142 (set-buffer start-buffer))))) | |
| 143 | |
|
2536
e8426c217792
(resume-empty-args-file): Renamed from empty-args-file.
Richard M. Stallman <rms@gnu.org>
parents:
2110
diff
changeset
|
144 ;;;###autoload |
|
2537
62b0d90a62e8
(resume-suspend-hook): Renamed from resume-empty-args-file.
Richard M. Stallman <rms@gnu.org>
parents:
2536
diff
changeset
|
145 (defun resume-suspend-hook () |
|
2536
e8426c217792
(resume-empty-args-file): Renamed from empty-args-file.
Richard M. Stallman <rms@gnu.org>
parents:
2110
diff
changeset
|
146 "Clear out the file used for transmitting args when Emacs resumes." |
| 82 | 147 (save-excursion |
|
2536
e8426c217792
(resume-empty-args-file): Renamed from empty-args-file.
Richard M. Stallman <rms@gnu.org>
parents:
2110
diff
changeset
|
148 (set-buffer (get-buffer-create resume-emacs-args-buffer)) |
| 82 | 149 (erase-buffer) |
|
2536
e8426c217792
(resume-empty-args-file): Renamed from empty-args-file.
Richard M. Stallman <rms@gnu.org>
parents:
2110
diff
changeset
|
150 (resume-write-buffer-to-file (current-buffer) resume-emacs-args-file))) |
| 82 | 151 |
|
2536
e8426c217792
(resume-empty-args-file): Renamed from empty-args-file.
Richard M. Stallman <rms@gnu.org>
parents:
2110
diff
changeset
|
152 (defun resume-write-buffer-to-file (buffer file) |
| 82 | 153 "Writes the contents of BUFFER into FILE, if permissions allow." |
| 154 (if (not (file-writable-p file)) | |
| 155 (error "No permission to write file %s" file)) | |
| 156 (save-excursion | |
| 157 (set-buffer buffer) | |
| 158 (clear-visited-file-modtime) | |
| 159 (save-restriction | |
| 160 (widen) | |
| 161 (write-region (point-min) (point-max) file nil 'quiet)) | |
| 162 (set-buffer-modified-p nil))) | |
|
658
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
244
diff
changeset
|
163 |
|
7cbd4fcd8b0f
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
244
diff
changeset
|
164 ;;; resume.el ends here |
