annotate lisp/progmodes/xscheme.el @ 51151:fe11e703042b

Summary: MIME support added for e-mail processing that skips encoded regions. Allow user to skip saving Fcc messages with large attachments. Fixed region skipping bug with multi-line comments - e.g. tex $ regions spanning multiple lines. Added support for postscript and uuencoded regions. Redundant dictionary file names purged. Dictionary definition field name changed from "Character Set" to "Coding System". Fixed bug in reloading dictionaries. Modified headers to reflect new version. XEmacs menu now adds customize item. (ispell-check-version): No longer an aliased function. Returns library path if not called interactively. Variable `temporary-file-directory' protected if not loaded. (check-ispell-version): Now the alias for `ispell-check-version'. (ispell-message-fcc-skip): New variable that determines if and when to query about saving Fcc copy of message if an attachment is large. (ispell-skip-html): Declared buffer-local. (ispell-local-dictionary-alist): Docstring expanded. Tag name changed from "Character Set" to "Coding System". (ispell-dictionary-alist-1): Removed redundant command-line option to load brasileiro, british, and castellano dictionary files. (ispell-dictionary-alist-2): Removed redundant command-line option to load czech dictionary file. (ispell-dictionary-alist-3): Moved francais-tex here. (ispell-dictionary-alist-4): Removed german and german8 dictionaries. The deutsch ones are the correct definitions. `nederlands' and `nederlands8' dictionaries moved here. (ispell-dictionary-alist-5): `polish' and `portugues' dictionaries moved here. Removed redundant command-line option to `norsk' and `portugues'. (ispell-dictionary-alist-6): Removed redundant command-line option to load `russian' and `slovak' dictionary files. (ispell-dictionary-alist): Tag name changed from "Character Set" to "Coding System". (ispell-version): Updated to 3.6. (ispell-library-directory): Calls non-deprecated function. (ispell-valid-dictionary-list): New function returning all valid dictionaries on machine. (ispell-checking-message): Documentation string improved. (ispell-skip-region-alist): Added uuencoded and postscript region skipping. Improved http/e-mail/file regexp to not match `/.\w'. (ispell-html-skip-alists): New variable for html region support. (ispell-send-string): Removed redundant xemacs check. (ispell-word): Fix spelling error in documentation string, added extent information to support highlighting in ispell-minor-mode. (ispell-command-loop): Disable horizontal scrollbar in XEmacs choices buffer. (ispell-show-choices): Directly select `choices-window'. (ispell-help): Use default buffer size for electric help. (ispell-adjusted-window-height): Correct for xemacs detection. (ispell-start-process): Don't double specify dictionary file name. (ispell-init-process): Set `ispell-library-path' each call. (ispell-change-dictionary): Now only completes valid dictionaries. (ispell-region): Add support for MIME region skipping and Fcc message query for large attachments. (ispell-begin-skip-region-regexp): Add documentation string. Added message support and cleaned up code for generic and html regions. (ispell-begin-skip-region): Function is now requires alist argument. (ispell-begin-tex-skip-regexp): Added comments and support improved html and message regions. (ispell-skip-region-list): New function for MIME and region skipping. (ispell-tex-arg-end): Add documentation string. (ispell-ignore-fcc): New function to query saving Fcc message. (ispell-skip-region): Calculate alist for key match dynamically, html skipping pushed to alists. (ispell-get-line): Add support for multi-line comment regions. (ispell): Check that variables to continue spelling are bound. (ispell-message-text-end): Postscript and uuencoded regions now supported as MIME regions, rather than as end-of-message region. (ispell-mime-multipartp): New function supporting MIME. (ispell-mime-skip-part): New function supporting MIME. (ispell-message): Add MIME support. (ispell-buffer-local-parsing): Variable `ispell-skip-html' now local. (ispell-buffer-local-dict): Fixed bug for detecting and reloading new dictionary.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Thu, 22 May 2003 21:34:00 +0000
parents 4abe2802e78c
children 695cf19ef79e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
50609
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1 ;;; xscheme.el --- run MIT Scheme under Emacs
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
2
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
3 ;; Copyright (C) 1986, 1987, 1989, 1990, 2001 Free Software Foundation, Inc.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
4
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
5 ;; Maintainer: FSF
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
6 ;; Keywords: languages, lisp
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
7
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
8 ;; This file is part of GNU Emacs.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
9
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
10 ;; GNU Emacs is free software; you can redistribute it and/or modify
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
11 ;; it under the terms of the GNU General Public License as published by
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
12 ;; the Free Software Foundation; either version 2, or (at your option)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
13 ;; any later version.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
14
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
15 ;; GNU Emacs is distributed in the hope that it will be useful,
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
18 ;; GNU General Public License for more details.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
19
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
20 ;; You should have received a copy of the GNU General Public License
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
23 ;; Boston, MA 02111-1307, USA.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
24
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
25 ;;; Commentary:
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
26
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
27 ;; A major mode for interacting with MIT Scheme.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
28 ;;
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
29 ;; Requires MIT Scheme release 5 or later.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
30 ;; Changes to Control-G handler require runtime version 13.85 or later.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
31
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
32 ;;; Code:
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
33
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
34 (require 'scheme)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
35
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
36 (defgroup xscheme nil
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
37 "Major mode for editing Scheme and interacting with MIT's C-Scheme."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
38 :group 'lisp)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
39
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
40 (defcustom scheme-band-name nil
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
41 "*Band loaded by the `run-scheme' command."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
42 :type '(choice (const nil) string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
43 :group 'xscheme)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
44
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
45 (defcustom scheme-program-arguments nil
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
46 "*Arguments passed to the Scheme program by the `run-scheme' command."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
47 :type '(choice (const nil) string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
48 :group 'xscheme)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
49
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
50 (defcustom xscheme-allow-pipelined-evaluation t
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
51 "If non-nil, an expression may be transmitted while another is evaluating.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
52 Otherwise, attempting to evaluate an expression before the previous expression
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
53 has finished evaluating will signal an error."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
54 :type 'boolean
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
55 :group 'xscheme)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
56
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
57 (defcustom xscheme-startup-message
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
58 "This is the Scheme process buffer.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
59 Type \\[advertised-xscheme-send-previous-expression] to evaluate the expression before point.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
60 Type \\[xscheme-send-control-g-interrupt] to abort evaluation.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
61 Type \\[describe-mode] for more information.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
62
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
63 "
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
64 "String to insert into Scheme process buffer first time it is started.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
65 Is processed with `substitute-command-keys' first."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
66 :type 'string
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
67 :group 'xscheme)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
68
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
69 (defcustom xscheme-signal-death-message nil
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
70 "If non-nil, causes a message to be generated when the Scheme process dies."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
71 :type 'boolean
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
72 :group 'xscheme)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
73
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
74 (defcustom xscheme-start-hook nil
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
75 "If non-nil, a procedure to call when the Scheme process is started.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
76 When called, the current buffer will be the Scheme process-buffer."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
77 :type 'hook
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
78 :group 'xscheme
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
79 :version "20.3")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
80
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
81 (defun xscheme-evaluation-commands (keymap)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
82 (define-key keymap "\e\C-x" 'xscheme-send-definition)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
83 (define-key keymap "\C-x\C-e" 'advertised-xscheme-send-previous-expression)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
84 (define-key keymap "\eo" 'xscheme-send-buffer)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
85 (define-key keymap "\ez" 'xscheme-send-definition)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
86 (define-key keymap "\e\C-m" 'xscheme-send-previous-expression)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
87 (define-key keymap "\e\C-z" 'xscheme-send-region))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
88
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
89 (defun xscheme-interrupt-commands (keymap)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
90 (define-key keymap "\C-c\C-s" 'xscheme-select-process-buffer)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
91 (define-key keymap "\C-c\C-b" 'xscheme-send-breakpoint-interrupt)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
92 (define-key keymap "\C-c\C-c" 'xscheme-send-control-g-interrupt)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
93 (define-key keymap "\C-c\C-u" 'xscheme-send-control-u-interrupt)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
94 (define-key keymap "\C-c\C-x" 'xscheme-send-control-x-interrupt))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
95
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
96 (xscheme-evaluation-commands scheme-mode-map)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
97 (xscheme-interrupt-commands scheme-mode-map)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
98
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
99 (defun run-scheme (command-line)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
100 "Run MIT Scheme in an inferior process.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
101 Output goes to the buffer `*scheme*'.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
102 With argument, asks for a command line."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
103 (interactive (list (xscheme-read-command-line current-prefix-arg)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
104 (xscheme-start command-line xscheme-process-name xscheme-buffer-name))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
105
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
106 (defun xscheme-start (command-line process-name buffer-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
107 (setq-default xscheme-process-command-line command-line)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
108 (switch-to-buffer
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
109 (xscheme-start-process command-line process-name buffer-name))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
110 (make-local-variable 'xscheme-process-command-line)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
111 (setq xscheme-process-command-line command-line))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
112
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
113 (defun xscheme-read-command-line (arg)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
114 (let ((default
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
115 (or xscheme-process-command-line
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
116 (xscheme-default-command-line))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
117 (if arg
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
118 (read-string "Run Scheme: " default)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
119 default)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
120
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
121 (defun xscheme-default-command-line ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
122 (concat scheme-program-name " -emacs"
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
123 (if scheme-program-arguments
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
124 (concat " " scheme-program-arguments)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
125 "")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
126 (if scheme-band-name
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
127 (concat " -band " scheme-band-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
128 "")))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
129
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
130 (defun reset-scheme ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
131 "Reset the Scheme process."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
132 (interactive)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
133 (let ((process (get-process xscheme-process-name)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
134 (cond ((or (not process)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
135 (not (eq (process-status process) 'run))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
136 (yes-or-no-p
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
137 "The Scheme process is running, are you SURE you want to reset it? "))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
138 (message "Resetting Scheme process...")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
139 (if process
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
140 (progn
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
141 (kill-process process t)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
142 (delete-process process)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
143 (xscheme-start-process xscheme-process-command-line
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
144 xscheme-process-name
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
145 xscheme-buffer-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
146 (message "Resetting Scheme process...done")))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
147
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
148 ;;;; Multiple Scheme buffer management commands
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
149
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
150 (defun start-scheme (buffer-name &optional globally)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
151 "Choose a scheme interaction buffer, or create a new one."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
152 ;; (interactive "BScheme interaction buffer: \nP")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
153 (interactive
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
154 (list (read-buffer "Scheme interaction buffer: "
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
155 xscheme-buffer-name
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
156 nil)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
157 current-prefix-arg))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
158 (let ((buffer (get-buffer-create buffer-name)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
159 (let ((process (get-buffer-process buffer)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
160 (if process
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
161 (switch-to-buffer buffer)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
162 (if (or (not (buffer-file-name buffer))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
163 (yes-or-no-p (concat "Buffer "
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
164 (buffer-name buffer)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
165 " contains file "
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
166 (buffer-file-name buffer)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
167 "; start scheme in it? ")))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
168 (progn
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
169 (xscheme-start (xscheme-read-command-line t)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
170 buffer-name
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
171 buffer-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
172 (if globally
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
173 (global-set-scheme-interaction-buffer buffer-name)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
174 (message "start-scheme aborted"))))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
175
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
176 (fset 'select-scheme 'start-scheme)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
177
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
178 (defun global-set-scheme-interaction-buffer (buffer-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
179 "Set the default scheme interaction buffer."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
180 (interactive
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
181 (list (read-buffer "Scheme interaction buffer: "
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
182 xscheme-buffer-name
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
183 t)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
184 (let ((process-name (verify-xscheme-buffer buffer-name nil)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
185 (setq-default xscheme-buffer-name buffer-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
186 (setq-default xscheme-process-name process-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
187 (setq-default xscheme-runlight-string
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
188 (save-excursion (set-buffer buffer-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
189 xscheme-runlight-string))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
190 (setq-default xscheme-runlight
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
191 (if (eq (process-status process-name) 'run)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
192 default-xscheme-runlight
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
193 ""))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
194
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
195 (defun local-set-scheme-interaction-buffer (buffer-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
196 "Set the scheme interaction buffer for the current buffer."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
197 (interactive
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
198 (list (read-buffer "Scheme interaction buffer: "
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
199 xscheme-buffer-name
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
200 t)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
201 (let ((process-name (verify-xscheme-buffer buffer-name t)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
202 (make-local-variable 'xscheme-buffer-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
203 (setq xscheme-buffer-name buffer-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
204 (make-local-variable 'xscheme-process-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
205 (setq xscheme-process-name process-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
206 (make-local-variable 'xscheme-runlight)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
207 (setq xscheme-runlight (save-excursion (set-buffer buffer-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
208 xscheme-runlight))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
209
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
210 (defun local-clear-scheme-interaction-buffer ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
211 "Make the current buffer use the default scheme interaction buffer."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
212 (interactive)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
213 (if (xscheme-process-buffer-current-p)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
214 (error "Cannot change the interaction buffer of an interaction buffer"))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
215 (kill-local-variable 'xscheme-buffer-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
216 (kill-local-variable 'xscheme-process-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
217 (kill-local-variable 'xscheme-runlight))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
218
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
219 (defun verify-xscheme-buffer (buffer-name localp)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
220 (if (and localp (xscheme-process-buffer-current-p))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
221 (error "Cannot change the interaction buffer of an interaction buffer"))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
222 (let* ((buffer (get-buffer buffer-name))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
223 (process (and buffer (get-buffer-process buffer))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
224 (cond ((not buffer)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
225 (error "Buffer does not exist" buffer-name))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
226 ((not process)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
227 (error "Buffer is not a scheme interaction buffer" buffer-name))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
228 (t
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
229 (save-excursion
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
230 (set-buffer buffer)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
231 (if (not (xscheme-process-buffer-current-p))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
232 (error "Buffer is not a scheme interaction buffer"
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
233 buffer-name)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
234 (process-name process)))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
235
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
236 ;;;; Interaction Mode
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
237
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
238 (defun scheme-interaction-mode (&optional preserve)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
239 "Major mode for interacting with an inferior MIT Scheme process.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
240 Like scheme-mode except that:
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
241
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
242 \\[advertised-xscheme-send-previous-expression] sends the expression before point to the Scheme process as input
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
243 \\[xscheme-yank-pop] yanks an expression previously sent to Scheme
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
244 \\[xscheme-yank-push] yanks an expression more recently sent to Scheme
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
245
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
246 All output from the Scheme process is written in the Scheme process
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
247 buffer, which is initially named \"*scheme*\". The result of
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
248 evaluating a Scheme expression is also printed in the process buffer,
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
249 preceded by the string \";Value: \" to highlight it. If the process
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
250 buffer is not visible at that time, the value will also be displayed
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
251 in the minibuffer. If an error occurs, the process buffer will
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
252 automatically pop up to show you the error message.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
253
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
254 While the Scheme process is running, the modelines of all buffers in
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
255 scheme-mode are modified to show the state of the process. The
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
256 possible states and their meanings are:
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
257
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
258 input waiting for input
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
259 run evaluating
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
260 gc garbage collecting
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
261
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
262 The process buffer's modeline contains additional information where
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
263 the buffer's name is normally displayed: the command interpreter level
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
264 and type.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
265
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
266 Scheme maintains a stack of command interpreters. Every time an error
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
267 or breakpoint occurs, the current command interpreter is pushed on the
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
268 command interpreter stack, and a new command interpreter is started.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
269 One example of why this is done is so that an error that occurs while
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
270 you are debugging another error will not destroy the state of the
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
271 initial error, allowing you to return to it after the second error has
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
272 been fixed.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
273
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
274 The command interpreter level indicates how many interpreters are in
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
275 the command interpreter stack. It is initially set to one, and it is
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
276 incremented every time that stack is pushed, and decremented every
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
277 time it is popped. The following commands are useful for manipulating
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
278 the command interpreter stack:
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
279
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
280 \\[xscheme-send-breakpoint-interrupt] pushes the stack once
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
281 \\[xscheme-send-control-u-interrupt] pops the stack once
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
282 \\[xscheme-send-control-g-interrupt] pops everything off
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
283 \\[xscheme-send-control-x-interrupt] aborts evaluation, doesn't affect stack
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
284
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
285 Some possible command interpreter types and their meanings are:
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
286
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
287 \[Evaluator] read-eval-print loop for evaluating expressions
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
288 \[Debugger] single character commands for debugging errors
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
289 \[Where] single character commands for examining environments
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
290
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
291 Starting with release 6.2 of Scheme, the latter two types of command
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
292 interpreters will change the major mode of the Scheme process buffer
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
293 to scheme-debugger-mode , in which the evaluation commands are
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
294 disabled, and the keys which normally self insert instead send
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
295 themselves to the Scheme process. The command character ? will list
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
296 the available commands.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
297
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
298 For older releases of Scheme, the major mode will be be
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
299 scheme-interaction-mode , and the command characters must be sent as
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
300 if they were expressions.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
301
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
302 Commands:
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
303 Delete converts tabs to spaces as it moves back.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
304 Blank lines separate paragraphs. Semicolons start comments.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
305 \\{scheme-interaction-mode-map}
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
306
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
307 Entry to this mode calls the value of scheme-interaction-mode-hook
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
308 with no args, if that value is non-nil.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
309 Likewise with the value of scheme-mode-hook.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
310 scheme-interaction-mode-hook is called after scheme-mode-hook."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
311 (interactive "P")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
312 (if (not preserve)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
313 (let ((previous-mode major-mode))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
314 (kill-all-local-variables)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
315 (make-local-variable 'xscheme-previous-mode)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
316 (make-local-variable 'xscheme-buffer-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
317 (make-local-variable 'xscheme-process-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
318 (make-local-variable 'xscheme-previous-process-state)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
319 (make-local-variable 'xscheme-runlight-string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
320 (make-local-variable 'xscheme-runlight)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
321 (make-local-variable 'xscheme-last-input-end)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
322 (setq xscheme-previous-mode previous-mode)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
323 (let ((buffer (current-buffer)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
324 (setq xscheme-buffer-name (buffer-name buffer))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
325 (setq xscheme-last-input-end (make-marker))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
326 (let ((process (get-buffer-process buffer)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
327 (if process
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
328 (progn
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
329 (setq xscheme-process-name (process-name process))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
330 (setq xscheme-previous-process-state
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
331 (cons (process-filter process)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
332 (process-sentinel process)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
333 (xscheme-process-filter-initialize t)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
334 (xscheme-modeline-initialize xscheme-buffer-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
335 (set-process-sentinel process 'xscheme-process-sentinel)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
336 (set-process-filter process 'xscheme-process-filter))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
337 (setq xscheme-previous-process-state (cons nil nil)))))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
338 (scheme-interaction-mode-initialize)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
339 (scheme-mode-variables)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
340 (run-hooks 'scheme-mode-hook 'scheme-interaction-mode-hook))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
341
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
342 (defun exit-scheme-interaction-mode ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
343 "Take buffer out of scheme interaction mode"
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
344 (interactive)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
345 (if (not (eq major-mode 'scheme-interaction-mode))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
346 (error "Buffer not in scheme interaction mode"))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
347 (let ((previous-state xscheme-previous-process-state))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
348 (funcall xscheme-previous-mode)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
349 (let ((process (get-buffer-process (current-buffer))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
350 (if process
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
351 (progn
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
352 (if (eq (process-filter process) 'xscheme-process-filter)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
353 (set-process-filter process (car previous-state)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
354 (if (eq (process-sentinel process) 'xscheme-process-sentinel)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
355 (set-process-sentinel process (cdr previous-state))))))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
356
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
357 (defun scheme-interaction-mode-initialize ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
358 (use-local-map scheme-interaction-mode-map)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
359 (setq major-mode 'scheme-interaction-mode)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
360 (setq mode-name "Scheme Interaction"))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
361
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
362 (defun scheme-interaction-mode-commands (keymap)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
363 (let ((entries scheme-interaction-mode-commands-alist))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
364 (while entries
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
365 (define-key keymap
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
366 (car (car entries))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
367 (car (cdr (car entries))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
368 (setq entries (cdr entries)))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
369
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
370 (defvar scheme-interaction-mode-commands-alist nil)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
371 (setq scheme-interaction-mode-commands-alist
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
372 (append scheme-interaction-mode-commands-alist
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
373 '(("\C-c\C-m" xscheme-send-current-line)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
374 ("\C-c\C-o" xscheme-delete-output)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
375 ("\C-c\C-p" xscheme-send-proceed)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
376 ("\C-c\C-y" xscheme-yank)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
377 ("\ep" xscheme-yank-pop)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
378 ("\en" xscheme-yank-push))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
379
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
380 (defvar scheme-interaction-mode-map nil)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
381 (if (not scheme-interaction-mode-map)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
382 (progn
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
383 (setq scheme-interaction-mode-map (make-keymap))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
384 (scheme-mode-commands scheme-interaction-mode-map)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
385 (xscheme-interrupt-commands scheme-interaction-mode-map)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
386 (xscheme-evaluation-commands scheme-interaction-mode-map)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
387 (scheme-interaction-mode-commands scheme-interaction-mode-map)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
388
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
389 (defun xscheme-enter-interaction-mode ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
390 (save-excursion
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
391 (set-buffer (xscheme-process-buffer))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
392 (if (not (eq major-mode 'scheme-interaction-mode))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
393 (if (eq major-mode 'scheme-debugger-mode)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
394 (scheme-interaction-mode-initialize)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
395 (scheme-interaction-mode t)))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
396
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
397 (fset 'advertised-xscheme-send-previous-expression
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
398 'xscheme-send-previous-expression)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
399
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
400 ;;;; Debugger Mode
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
401
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
402 (defun scheme-debugger-mode ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
403 "Major mode for executing the Scheme debugger.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
404 Like scheme-mode except that the evaluation commands
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
405 are disabled, and characters that would normally be self inserting are
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
406 sent to the Scheme process instead. Typing ? will show you which
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
407 characters perform useful functions.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
408
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
409 Commands:
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
410 \\{scheme-debugger-mode-map}"
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
411 (error "Illegal entry to scheme-debugger-mode"))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
412
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
413 (defun scheme-debugger-mode-initialize ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
414 (use-local-map scheme-debugger-mode-map)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
415 (setq major-mode 'scheme-debugger-mode)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
416 (setq mode-name "Scheme Debugger"))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
417
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
418 (defun scheme-debugger-mode-commands (keymap)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
419 (let ((char ? ))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
420 (while (< char 127)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
421 (define-key keymap (char-to-string char) 'scheme-debugger-self-insert)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
422 (setq char (1+ char)))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
423
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
424 (defvar scheme-debugger-mode-map nil)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
425 (if (not scheme-debugger-mode-map)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
426 (progn
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
427 (setq scheme-debugger-mode-map (make-keymap))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
428 (scheme-mode-commands scheme-debugger-mode-map)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
429 (xscheme-interrupt-commands scheme-debugger-mode-map)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
430 (scheme-debugger-mode-commands scheme-debugger-mode-map)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
431
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
432 (defun scheme-debugger-self-insert ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
433 "Transmit this character to the Scheme process."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
434 (interactive)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
435 (xscheme-send-char last-command-char))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
436
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
437 (defun xscheme-enter-debugger-mode (prompt-string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
438 (save-excursion
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
439 (set-buffer (xscheme-process-buffer))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
440 (if (not (eq major-mode 'scheme-debugger-mode))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
441 (progn
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
442 (if (not (eq major-mode 'scheme-interaction-mode))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
443 (scheme-interaction-mode t))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
444 (scheme-debugger-mode-initialize)))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
445
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
446 (defun xscheme-debugger-mode-p ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
447 (let ((buffer (xscheme-process-buffer)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
448 (and buffer
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
449 (save-excursion
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
450 (set-buffer buffer)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
451 (eq major-mode 'scheme-debugger-mode)))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
452
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
453 ;;;; Evaluation Commands
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
454
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
455 (defun xscheme-send-string (&rest strings)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
456 "Send the string arguments to the Scheme process.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
457 The strings are concatenated and terminated by a newline."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
458 (cond ((not (xscheme-process-running-p))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
459 (if (yes-or-no-p "The Scheme process has died. Reset it? ")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
460 (progn
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
461 (reset-scheme)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
462 (xscheme-wait-for-process)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
463 (xscheme-send-string-1 strings))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
464 ((xscheme-debugger-mode-p) (error "No sends allowed in debugger mode"))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
465 ((and (not xscheme-allow-pipelined-evaluation)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
466 xscheme-running-p)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
467 (error "No sends allowed while Scheme running"))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
468 (t (xscheme-send-string-1 strings))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
469
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
470 (defun xscheme-send-string-1 (strings)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
471 (let ((string (apply 'concat strings)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
472 (xscheme-send-string-2 string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
473 (if (eq major-mode 'scheme-interaction-mode)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
474 (xscheme-insert-expression string))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
475
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
476 (defun xscheme-send-string-2 (string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
477 (let ((process (get-process xscheme-process-name)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
478 (process-send-string process (concat string "\n"))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
479 (if (xscheme-process-buffer-current-p)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
480 (set-marker (process-mark process) (point)))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
481
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
482 (defun xscheme-select-process-buffer ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
483 "Select the Scheme process buffer and move to its output point."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
484 (interactive)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
485 (let ((process
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
486 (or (get-process xscheme-process-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
487 (error "No scheme process"))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
488 (let ((buffer (or (process-buffer process) (error "No process buffer"))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
489 (let ((window (get-buffer-window buffer)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
490 (if window
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
491 (select-window window)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
492 (switch-to-buffer buffer))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
493 (goto-char (process-mark process))))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
494
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
495 ;;;; Scheme expressions ring
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
496
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
497 (defun xscheme-insert-expression (string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
498 (setq xscheme-expressions-ring (cons string xscheme-expressions-ring))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
499 (if (> (length xscheme-expressions-ring) xscheme-expressions-ring-max)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
500 (setcdr (nthcdr (1- xscheme-expressions-ring-max)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
501 xscheme-expressions-ring)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
502 nil))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
503 (setq xscheme-expressions-ring-yank-pointer xscheme-expressions-ring))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
504
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
505 (defun xscheme-rotate-yank-pointer (arg)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
506 "Rotate the yanking point in the kill ring."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
507 (interactive "p")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
508 (let ((length (length xscheme-expressions-ring)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
509 (if (zerop length)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
510 (error "Scheme expression ring is empty")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
511 (setq xscheme-expressions-ring-yank-pointer
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
512 (let ((index
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
513 (% (+ arg
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
514 (- length
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
515 (length xscheme-expressions-ring-yank-pointer)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
516 length)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
517 (nthcdr (if (< index 0)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
518 (+ index length)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
519 index)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
520 xscheme-expressions-ring))))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
521
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
522 (defun xscheme-yank (&optional arg)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
523 "Insert the most recent expression at point.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
524 With just C-U as argument, same but put point in front (and mark at end).
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
525 With argument n, reinsert the nth most recently sent expression.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
526 See also the commands \\[xscheme-yank-pop] and \\[xscheme-yank-push]."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
527 (interactive "*P")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
528 (xscheme-rotate-yank-pointer (if (listp arg) 0
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
529 (if (eq arg '-) -1
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
530 (1- arg))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
531 (push-mark (point))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
532 (insert (car xscheme-expressions-ring-yank-pointer))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
533 (if (consp arg)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
534 (exchange-point-and-mark)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
535
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
536 ;; Old name, to avoid errors in users' init files.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
537 (fset 'xscheme-yank-previous-send
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
538 'xscheme-yank)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
539
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
540 (defun xscheme-yank-pop (arg)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
541 "Insert or replace a just-yanked expression with an older expression.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
542 If the previous command was not a yank, it yanks.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
543 Otherwise, the region contains a stretch of reinserted
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
544 expression. yank-pop deletes that text and inserts in its
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
545 place a different expression.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
546
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
547 With no argument, the next older expression is inserted.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
548 With argument n, the n'th older expression is inserted.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
549 If n is negative, this is a more recent expression.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
550
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
551 The sequence of expressions wraps around, so that after the oldest one
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
552 comes the newest one."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
553 (interactive "*p")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
554 (setq this-command 'xscheme-yank)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
555 (if (not (eq last-command 'xscheme-yank))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
556 (progn
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
557 (xscheme-yank)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
558 (setq arg (- arg 1))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
559 (if (not (= arg 0))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
560 (let ((before (< (point) (mark))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
561 (delete-region (point) (mark))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
562 (xscheme-rotate-yank-pointer arg)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
563 (set-mark (point))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
564 (insert (car xscheme-expressions-ring-yank-pointer))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
565 (if before (exchange-point-and-mark)))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
566
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
567 (defun xscheme-yank-push (arg)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
568 "Insert or replace a just-yanked expression with a more recent expression.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
569 If the previous command was not a yank, it yanks.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
570 Otherwise, the region contains a stretch of reinserted
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
571 expression. yank-pop deletes that text and inserts in its
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
572 place a different expression.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
573
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
574 With no argument, the next more recent expression is inserted.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
575 With argument n, the n'th more recent expression is inserted.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
576 If n is negative, a less recent expression is used.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
577
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
578 The sequence of expressions wraps around, so that after the oldest one
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
579 comes the newest one."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
580 (interactive "*p")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
581 (xscheme-yank-pop (- 0 arg)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
582
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
583 (defun xscheme-send-region (start end)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
584 "Send the current region to the Scheme process.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
585 The region is sent terminated by a newline."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
586 (interactive "r")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
587 (if (xscheme-process-buffer-current-p)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
588 (progn
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
589 (goto-char end)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
590 (if (not (bolp))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
591 (insert-before-markers ?\n))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
592 (set-marker (process-mark (get-process xscheme-process-name))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
593 (point))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
594 (set-marker xscheme-last-input-end (point))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
595 (xscheme-send-string (buffer-substring start end)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
596
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
597 (defun xscheme-send-definition ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
598 "Send the current definition to the Scheme process.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
599 If the current line begins with a non-whitespace character,
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
600 parse an expression from the beginning of the line and send that instead."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
601 (interactive)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
602 (let ((start nil) (end nil))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
603 (save-excursion
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
604 (end-of-defun)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
605 (setq end (point))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
606 (if (re-search-backward "^\\s(" nil t)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
607 (setq start (point))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
608 (error "Can't find definition")))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
609 (xscheme-send-region start end)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
610
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
611 (defun xscheme-send-next-expression ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
612 "Send the expression to the right of `point' to the Scheme process."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
613 (interactive)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
614 (let ((start (point)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
615 (xscheme-send-region start (save-excursion (forward-sexp) (point)))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
616
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
617 (defun xscheme-send-previous-expression ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
618 "Send the expression to the left of `point' to the Scheme process."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
619 (interactive)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
620 (let ((end (point)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
621 (xscheme-send-region (save-excursion (backward-sexp) (point)) end)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
622
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
623 (defun xscheme-send-current-line ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
624 "Send the current line to the Scheme process.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
625 Useful for working with debugging Scheme under adb."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
626 (interactive)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
627 (let ((line
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
628 (save-excursion
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
629 (beginning-of-line)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
630 (let ((start (point)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
631 (end-of-line)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
632 (buffer-substring start (point))))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
633 (end-of-line)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
634 (insert ?\n)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
635 (xscheme-send-string-2 line)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
636
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
637 (defun xscheme-send-buffer ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
638 "Send the current buffer to the Scheme process."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
639 (interactive)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
640 (if (xscheme-process-buffer-current-p)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
641 (error "Not allowed to send this buffer's contents to Scheme"))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
642 (xscheme-send-region (point-min) (point-max)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
643
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
644 (defun xscheme-send-char (char)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
645 "Prompt for a character and send it to the Scheme process."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
646 (interactive "cCharacter to send: ")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
647 (process-send-string xscheme-process-name (char-to-string char)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
648
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
649 (defun xscheme-delete-output ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
650 "Delete all output from interpreter since last input."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
651 (interactive)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
652 (let ((proc (get-buffer-process (current-buffer))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
653 (save-excursion
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
654 (goto-char (process-mark proc))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
655 (re-search-backward
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
656 "^;\\(Unspecified return value$\\|Value\\( [0-9]+\\)?: \\|\\(Abort\\|Up\\|Quit\\)!$\\)"
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
657 xscheme-last-input-end
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
658 t)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
659 (forward-line 0)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
660 (if (< (marker-position xscheme-last-input-end) (point))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
661 (progn
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
662 (delete-region xscheme-last-input-end (point))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
663 (insert-before-markers "*** output flushed ***\n"))))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
664
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
665 ;;;; Interrupts
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
666
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
667 (defun xscheme-send-breakpoint-interrupt ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
668 "Cause the Scheme process to enter a breakpoint."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
669 (interactive)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
670 (xscheme-send-interrupt ?b nil))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
671
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
672 (defun xscheme-send-proceed ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
673 "Cause the Scheme process to proceed from a breakpoint."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
674 (interactive)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
675 (process-send-string xscheme-process-name "(proceed)\n"))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
676
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
677 (defun xscheme-send-control-g-interrupt ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
678 "Cause the Scheme processor to halt and flush input.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
679 Control returns to the top level rep loop."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
680 (interactive)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
681 (let ((inhibit-quit t))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
682 (cond ((not xscheme-control-g-synchronization-p)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
683 (interrupt-process xscheme-process-name))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
684 ((save-excursion
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
685 (set-buffer xscheme-buffer-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
686 xscheme-control-g-disabled-p)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
687 (message "Relax..."))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
688 (t
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
689 (save-excursion
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
690 (set-buffer xscheme-buffer-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
691 (setq xscheme-control-g-disabled-p t))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
692 (message xscheme-control-g-message-string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
693 (interrupt-process xscheme-process-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
694 (sleep-for 0.1)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
695 (xscheme-send-char 0)))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
696
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
697 (defconst xscheme-control-g-message-string
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
698 "Sending C-G interrupt to Scheme...")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
699
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
700 (defun xscheme-send-control-u-interrupt ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
701 "Cause the Scheme process to halt, returning to previous rep loop."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
702 (interactive)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
703 (xscheme-send-interrupt ?u t))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
704
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
705 (defun xscheme-send-control-x-interrupt ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
706 "Cause the Scheme process to halt, returning to current rep loop."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
707 (interactive)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
708 (xscheme-send-interrupt ?x t))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
709
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
710 ;;; This doesn't really work right -- Scheme just gobbles the first
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
711 ;;; character in the input. There is no way for us to guarantee that
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
712 ;;; the argument to this procedure is the first char unless we put
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
713 ;;; some kind of marker in the input stream.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
714
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
715 (defun xscheme-send-interrupt (char mark-p)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
716 "Send a ^A type interrupt to the Scheme process."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
717 (interactive "cInterrupt character to send: ")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
718 (quit-process xscheme-process-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
719 (sleep-for 0.1)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
720 (xscheme-send-char char)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
721 (if (and mark-p xscheme-control-g-synchronization-p)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
722 (xscheme-send-char 0)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
723
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
724 ;;;; Internal Variables
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
725
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
726 (defvar xscheme-process-command-line nil
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
727 "Command used to start the most recent Scheme process.")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
728
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
729 (defvar xscheme-process-name "scheme"
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
730 "Name of xscheme process that we're currently interacting with.")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
731
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
732 (defvar xscheme-buffer-name "*scheme*"
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
733 "Name of xscheme buffer that we're currently interacting with.")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
734
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
735 (defvar xscheme-expressions-ring-max 30
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
736 "*Maximum length of Scheme expressions ring.")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
737
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
738 (defvar xscheme-expressions-ring nil
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
739 "List of expressions recently transmitted to the Scheme process.")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
740
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
741 (defvar xscheme-expressions-ring-yank-pointer nil
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
742 "The tail of the Scheme expressions ring whose car is the last thing yanked.")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
743
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
744 (defvar xscheme-last-input-end)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
745
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
746 (defvar xscheme-process-filter-state 'idle
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
747 "State of scheme process escape reader state machine:
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
748 idle waiting for an escape sequence
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
749 reading-type received an altmode but nothing else
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
750 reading-string reading prompt string")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
751
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
752 (defvar xscheme-running-p nil
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
753 "This variable, if nil, indicates that the scheme process is
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
754 waiting for input. Otherwise, it is busy evaluating something.")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
755
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
756 (defconst xscheme-control-g-synchronization-p t
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
757 "If non-nil, insert markers in the scheme input stream to indicate when
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
758 control-g interrupts were signaled. Do not allow more control-g's to be
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
759 signaled until the scheme process acknowledges receipt.")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
760
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
761 (defvar xscheme-control-g-disabled-p nil
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
762 "This variable, if non-nil, indicates that a control-g is being processed
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
763 by the scheme process, so additional control-g's are to be ignored.")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
764
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
765 (defvar xscheme-allow-output-p t
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
766 "This variable, if nil, prevents output from the scheme process
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
767 from being inserted into the process-buffer.")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
768
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
769 (defvar xscheme-prompt ""
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
770 "The current scheme prompt string.")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
771
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
772 (defvar xscheme-string-accumulator ""
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
773 "Accumulator for the string being received from the scheme process.")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
774
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
775 (defvar xscheme-string-receiver nil
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
776 "Procedure to send the string argument from the scheme process.")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
777
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
778 (defconst default-xscheme-runlight
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
779 '(": " xscheme-runlight-string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
780 "Default global (shared) xscheme-runlight modeline format.")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
781
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
782 (defvar xscheme-runlight "")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
783 (defvar xscheme-runlight-string nil)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
784 (defvar xscheme-mode-string nil)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
785 (setq-default scheme-mode-line-process
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
786 '("" xscheme-runlight))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
787
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
788 (mapcar 'make-variable-buffer-local
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
789 '(xscheme-expressions-ring
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
790 xscheme-expressions-ring-yank-pointer
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
791 xscheme-process-filter-state
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
792 xscheme-running-p
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
793 xscheme-control-g-disabled-p
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
794 xscheme-allow-output-p
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
795 xscheme-prompt
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
796 xscheme-string-accumulator
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
797 xscheme-mode-string
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
798 scheme-mode-line-process))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
799
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
800 ;;;; Basic Process Control
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
801
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
802 (defun xscheme-start-process (command-line the-process the-buffer)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
803 (let ((buffer (get-buffer-create the-buffer)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
804 (let ((process (get-buffer-process buffer)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
805 (save-excursion
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
806 (set-buffer buffer)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
807 (if (and process (memq (process-status process) '(run stop)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
808 (set-marker (process-mark process) (point-max))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
809 (progn (if process (delete-process process))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
810 (goto-char (point-max))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
811 (scheme-interaction-mode nil)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
812 (setq xscheme-process-name the-process)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
813 (if (bobp)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
814 (insert-before-markers
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
815 (substitute-command-keys xscheme-startup-message)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
816 (setq process
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
817 (let ((process-connection-type nil))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
818 (apply 'start-process
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
819 (cons the-process
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
820 (cons buffer
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
821 (xscheme-parse-command-line
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
822 command-line))))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
823 (if (not (equal (process-name process) the-process))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
824 (setq xscheme-process-name (process-name process)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
825 (if (not (equal (buffer-name buffer) the-buffer))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
826 (setq xscheme-buffer-name (buffer-name buffer)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
827 (message "Starting process %s in buffer %s"
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
828 xscheme-process-name
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
829 xscheme-buffer-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
830 (set-marker (process-mark process) (point-max))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
831 (xscheme-process-filter-initialize t)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
832 (xscheme-modeline-initialize xscheme-buffer-name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
833 (set-process-sentinel process 'xscheme-process-sentinel)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
834 (set-process-filter process 'xscheme-process-filter)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
835 (run-hooks 'xscheme-start-hook)))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
836 buffer))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
837
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
838 (defun xscheme-parse-command-line (string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
839 (setq string (substitute-in-file-name string))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
840 (let ((start 0)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
841 (result '()))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
842 (while start
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
843 (let ((index (string-match "[ \t]" string start)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
844 (setq start
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
845 (cond ((not index)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
846 (setq result
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
847 (cons (substring string start)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
848 result))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
849 nil)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
850 ((= index start)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
851 (string-match "[^ \t]" string start))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
852 (t
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
853 (setq result
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
854 (cons (substring string start index)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
855 result))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
856 (1+ index))))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
857 (nreverse result)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
858
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
859 (defun xscheme-wait-for-process ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
860 (sleep-for 2)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
861 (while xscheme-running-p
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
862 (sleep-for 1)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
863
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
864 (defun xscheme-process-running-p ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
865 "True iff there is a Scheme process whose status is `run'."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
866 (let ((process (get-process xscheme-process-name)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
867 (and process
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
868 (eq (process-status process) 'run))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
869
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
870 (defun xscheme-process-buffer ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
871 (let ((process (get-process xscheme-process-name)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
872 (and process (process-buffer process))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
873
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
874 (defun xscheme-process-buffer-window ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
875 (let ((buffer (xscheme-process-buffer)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
876 (and buffer (get-buffer-window buffer))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
877
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
878 (defun xscheme-process-buffer-current-p ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
879 "True iff the current buffer is the Scheme process buffer."
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
880 (eq (xscheme-process-buffer) (current-buffer)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
881
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
882 ;;;; Process Filter
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
883
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
884 (defun xscheme-process-sentinel (proc reason)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
885 (let* ((buffer (process-buffer proc))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
886 (name (buffer-name buffer)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
887 (save-excursion
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
888 (set-buffer buffer)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
889 (xscheme-process-filter-initialize (eq reason 'run))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
890 (if (not (eq reason 'run))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
891 (progn
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
892 (setq scheme-mode-line-process "")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
893 (setq xscheme-mode-string "no process")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
894 (if (equal name (default-value 'xscheme-buffer-name))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
895 (setq-default xscheme-runlight ""))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
896 (if (and (not (memq reason '(run stop)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
897 xscheme-signal-death-message)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
898 (progn
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
899 (beep)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
900 (message
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
901 "The Scheme process has died! Do M-x reset-scheme to restart it"))))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
902
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
903 (defun xscheme-process-filter-initialize (running-p)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
904 (setq xscheme-process-filter-state 'idle)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
905 (setq xscheme-running-p running-p)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
906 (setq xscheme-control-g-disabled-p nil)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
907 (setq xscheme-allow-output-p t)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
908 (setq xscheme-prompt "")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
909 (if running-p
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
910 (let ((name (buffer-name (current-buffer))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
911 (setq scheme-mode-line-process '(": " xscheme-runlight-string))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
912 (xscheme-modeline-initialize name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
913 (if (equal name (default-value 'xscheme-buffer-name))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
914 (setq-default xscheme-runlight default-xscheme-runlight))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
915 (if (or (eq xscheme-runlight default-xscheme-runlight)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
916 (equal xscheme-runlight ""))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
917 (setq xscheme-runlight (list ": " 'xscheme-buffer-name ": " "?")))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
918 (rplaca (nthcdr 3 xscheme-runlight)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
919 (if running-p "?" "no process")))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
920
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
921 (defun xscheme-process-filter (proc string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
922 (let ((xscheme-filter-input string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
923 (call-noexcursion nil))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
924 (while xscheme-filter-input
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
925 (setq call-noexcursion nil)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
926 (save-excursion
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
927 (set-buffer (process-buffer proc))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
928 (cond ((eq xscheme-process-filter-state 'idle)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
929 (let ((start (string-match "\e" xscheme-filter-input)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
930 (if start
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
931 (progn
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
932 (xscheme-process-filter-output
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
933 (substring xscheme-filter-input 0 start))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
934 (setq xscheme-filter-input
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
935 (substring xscheme-filter-input (1+ start)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
936 (setq xscheme-process-filter-state 'reading-type))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
937 (let ((string xscheme-filter-input))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
938 (setq xscheme-filter-input nil)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
939 (xscheme-process-filter-output string)))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
940 ((eq xscheme-process-filter-state 'reading-type)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
941 (if (zerop (length xscheme-filter-input))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
942 (setq xscheme-filter-input nil)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
943 (let ((char (aref xscheme-filter-input 0)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
944 (setq xscheme-filter-input
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
945 (substring xscheme-filter-input 1))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
946 (let ((entry (assoc char xscheme-process-filter-alist)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
947 (if entry
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
948 (funcall (nth 2 entry) (nth 1 entry))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
949 (progn
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
950 (xscheme-process-filter-output ?\e char)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
951 (setq xscheme-process-filter-state 'idle)))))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
952 ((eq xscheme-process-filter-state 'reading-string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
953 (let ((start (string-match "\e" xscheme-filter-input)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
954 (if start
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
955 (let ((string
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
956 (concat xscheme-string-accumulator
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
957 (substring xscheme-filter-input 0 start))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
958 (setq xscheme-filter-input
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
959 (substring xscheme-filter-input (1+ start)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
960 (setq xscheme-process-filter-state 'idle)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
961 (if (listp xscheme-string-receiver)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
962 (progn
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
963 (setq xscheme-string-receiver
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
964 (car xscheme-string-receiver))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
965 (setq call-noexcursion string))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
966 (funcall xscheme-string-receiver string)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
967 (progn
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
968 (setq xscheme-string-accumulator
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
969 (concat xscheme-string-accumulator
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
970 xscheme-filter-input))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
971 (setq xscheme-filter-input nil)))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
972 (t
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
973 (error "Scheme process filter -- bad state"))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
974 (if call-noexcursion
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
975 (funcall xscheme-string-receiver call-noexcursion)))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
976
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
977 ;;;; Process Filter Output
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
978
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
979 (defun xscheme-process-filter-output (&rest args)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
980 (if xscheme-allow-output-p
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
981 (let ((string (apply 'concat args)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
982 (save-excursion
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
983 (xscheme-goto-output-point)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
984 (let ((old-point (point)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
985 (while (string-match "\\(\007\\|\f\\)" string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
986 (let ((start (match-beginning 0))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
987 (end (match-end 0)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
988 (insert-before-markers (substring string 0 start))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
989 (if (= ?\f (aref string start))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
990 (progn
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
991 (if (not (bolp))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
992 (insert-before-markers ?\n))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
993 (insert-before-markers ?\f))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
994 (beep))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
995 (setq string (substring string (1+ start)))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
996 (insert-before-markers string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
997 (if (and xscheme-last-input-end
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
998 (equal (marker-position xscheme-last-input-end) (point)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
999 (set-marker xscheme-last-input-end old-point)))))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1000
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1001 (defun xscheme-guarantee-newlines (n)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1002 (if xscheme-allow-output-p
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1003 (save-excursion
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1004 (xscheme-goto-output-point)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1005 (let ((stop nil))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1006 (while (and (not stop)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1007 (bolp))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1008 (setq n (1- n))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1009 (if (bobp)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1010 (setq stop t)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1011 (backward-char))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1012 (xscheme-goto-output-point)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1013 (while (> n 0)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1014 (insert-before-markers ?\n)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1015 (setq n (1- n))))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1016
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1017 (defun xscheme-goto-output-point ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1018 (let ((process (get-process xscheme-process-name)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1019 (set-buffer (process-buffer process))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1020 (goto-char (process-mark process))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1021
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1022 (defun xscheme-modeline-initialize (name)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1023 (setq xscheme-runlight-string "")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1024 (if (equal name (default-value 'xscheme-buffer-name))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1025 (setq-default xscheme-runlight-string ""))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1026 (setq xscheme-mode-string "")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1027 (setq mode-line-buffer-identification
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1028 (list (concat name ": ")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1029 'xscheme-mode-string)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1030
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1031 (defun xscheme-set-runlight (runlight)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1032 (setq xscheme-runlight-string runlight)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1033 (if (equal (buffer-name (current-buffer))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1034 (default-value 'xscheme-buffer-name))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1035 (setq-default xscheme-runlight-string runlight))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1036 (rplaca (nthcdr 3 xscheme-runlight) runlight)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1037 (force-mode-line-update t))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1038
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1039 ;;;; Process Filter Operations
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1040
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1041 (defvar xscheme-process-filter-alist
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1042 '((?A xscheme-eval
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1043 xscheme-process-filter:string-action-noexcursion)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1044 (?D xscheme-enter-debugger-mode
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1045 xscheme-process-filter:string-action)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1046 (?E xscheme-eval
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1047 xscheme-process-filter:string-action)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1048 (?P xscheme-set-prompt-variable
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1049 xscheme-process-filter:string-action)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1050 (?R xscheme-enter-interaction-mode
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1051 xscheme-process-filter:simple-action)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1052 (?b xscheme-start-gc
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1053 xscheme-process-filter:simple-action)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1054 (?c xscheme-unsolicited-read-char
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1055 xscheme-process-filter:simple-action)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1056 (?e xscheme-finish-gc
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1057 xscheme-process-filter:simple-action)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1058 (?f xscheme-exit-input-wait
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1059 xscheme-process-filter:simple-action)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1060 (?g xscheme-enable-control-g
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1061 xscheme-process-filter:simple-action)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1062 (?i xscheme-prompt-for-expression
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1063 xscheme-process-filter:string-action)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1064 (?m xscheme-message
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1065 xscheme-process-filter:string-action)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1066 (?n xscheme-prompt-for-confirmation
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1067 xscheme-process-filter:string-action)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1068 (?o xscheme-output-goto
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1069 xscheme-process-filter:simple-action)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1070 (?p xscheme-set-prompt
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1071 xscheme-process-filter:string-action)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1072 (?s xscheme-enter-input-wait
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1073 xscheme-process-filter:simple-action)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1074 (?v xscheme-write-value
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1075 xscheme-process-filter:string-action)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1076 (?w xscheme-cd
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1077 xscheme-process-filter:string-action)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1078 (?z xscheme-display-process-buffer
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1079 xscheme-process-filter:simple-action))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1080 "Table used to decide how to handle process filter commands.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1081 Value is a list of entries, each entry is a list of three items.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1082
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1083 The first item is the character that the process filter dispatches on.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1084 The second item is the action to be taken, a function.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1085 The third item is the handler for the entry, a function.
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1086
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1087 When the process filter sees a command whose character matches a
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1088 particular entry, it calls the handler with two arguments: the action
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1089 and the string containing the rest of the process filter's input
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1090 stream. It is the responsibility of the handler to invoke the action
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1091 with the appropriate arguments, and to reenter the process filter with
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1092 the remaining input.")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1093
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1094 (defun xscheme-process-filter:simple-action (action)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1095 (setq xscheme-process-filter-state 'idle)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1096 (funcall action))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1097
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1098 (defun xscheme-process-filter:string-action (action)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1099 (setq xscheme-string-receiver action)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1100 (setq xscheme-string-accumulator "")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1101 (setq xscheme-process-filter-state 'reading-string))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1102
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1103 (defun xscheme-process-filter:string-action-noexcursion (action)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1104 (xscheme-process-filter:string-action (cons action nil)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1105
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1106 (defconst xscheme-runlight:running "run"
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1107 "The character displayed when the Scheme process is running.")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1108
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1109 (defconst xscheme-runlight:input "input"
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1110 "The character displayed when the Scheme process is waiting for input.")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1111
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1112 (defconst xscheme-runlight:gc "gc"
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1113 "The character displayed when the Scheme process is garbage collecting.")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1114
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1115 (defun xscheme-start-gc ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1116 (xscheme-set-runlight xscheme-runlight:gc))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1117
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1118 (defun xscheme-finish-gc ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1119 (xscheme-set-runlight
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1120 (if xscheme-running-p xscheme-runlight:running xscheme-runlight:input)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1121
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1122 (defun xscheme-enter-input-wait ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1123 (xscheme-set-runlight xscheme-runlight:input)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1124 (setq xscheme-control-g-disabled-p nil)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1125 (setq xscheme-running-p nil))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1126
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1127 (defun xscheme-exit-input-wait ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1128 (xscheme-set-runlight xscheme-runlight:running)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1129 (setq xscheme-running-p t))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1130
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1131 (defun xscheme-enable-control-g ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1132 (setq xscheme-control-g-disabled-p nil)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1133 (if (string= (current-message) xscheme-control-g-message-string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1134 (message nil)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1135
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1136 (defun xscheme-display-process-buffer ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1137 (let ((window (or (xscheme-process-buffer-window)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1138 (display-buffer (xscheme-process-buffer)))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1139 (save-window-excursion
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1140 (select-window window)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1141 (xscheme-goto-output-point)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1142 (if (xscheme-debugger-mode-p)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1143 (xscheme-enter-interaction-mode)))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1144
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1145 (defun xscheme-unsolicited-read-char ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1146 nil)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1147
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1148 (defun xscheme-eval (string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1149 (eval (car (read-from-string string))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1150
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1151 (defun xscheme-message (string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1152 (if (not (zerop (length string)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1153 (xscheme-write-message-1 string (format ";%s" string))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1154
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1155 (defun xscheme-write-value (string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1156 (if (zerop (length string))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1157 (xscheme-write-message-1 "(no value)" ";Unspecified return value")
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1158 (xscheme-write-message-1 string (format ";Value: %s" string))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1159
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1160 (defun xscheme-write-message-1 (message-string output-string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1161 (let* ((process (get-process xscheme-process-name))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1162 (window (get-buffer-window (process-buffer process))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1163 (if (or (not window)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1164 (not (pos-visible-in-window-p (process-mark process)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1165 window)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1166 (message "%s" message-string)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1167 (xscheme-guarantee-newlines 1)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1168 (xscheme-process-filter-output output-string))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1169
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1170 (defun xscheme-set-prompt-variable (string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1171 (setq xscheme-prompt string))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1172
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1173 (defun xscheme-set-prompt (string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1174 (setq xscheme-prompt string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1175 (xscheme-guarantee-newlines 2)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1176 (setq xscheme-mode-string (xscheme-coerce-prompt string))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1177 (force-mode-line-update t))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1178
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1179 (defun xscheme-output-goto ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1180 (xscheme-goto-output-point)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1181 (xscheme-guarantee-newlines 2))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1182
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1183 (defun xscheme-coerce-prompt (string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1184 (if (string-match "^[0-9]+ \\[[^]]+\\] " string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1185 (let ((end (match-end 0)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1186 (xscheme-process-filter-output (substring string end))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1187 (substring string 0 (- end 1)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1188 string))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1189
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1190 (defun xscheme-cd (directory-string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1191 (save-excursion
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1192 (set-buffer (xscheme-process-buffer))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1193 (cd directory-string)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1194
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1195 (defun xscheme-prompt-for-confirmation (prompt-string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1196 (xscheme-send-char (if (y-or-n-p prompt-string) ?y ?n)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1197
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1198 (defun xscheme-prompt-for-expression (prompt-string)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1199 (xscheme-send-string-2
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1200 (read-from-minibuffer prompt-string nil xscheme-prompt-for-expression-map)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1201
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1202 (defvar xscheme-prompt-for-expression-map nil)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1203 (if (not xscheme-prompt-for-expression-map)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1204 (progn
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1205 (setq xscheme-prompt-for-expression-map
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1206 (copy-keymap minibuffer-local-map))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1207 (substitute-key-definition 'exit-minibuffer
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1208 'xscheme-prompt-for-expression-exit
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1209 xscheme-prompt-for-expression-map)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1210
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1211 (defun xscheme-prompt-for-expression-exit ()
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1212 (interactive)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1213 (if (eq (xscheme-region-expression-p (point-min) (point-max)) 'one)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1214 (exit-minibuffer)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1215 (error "input must be a single, complete expression")))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1216
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1217 (defun xscheme-region-expression-p (start end)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1218 (save-excursion
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1219 (let ((old-syntax-table (syntax-table)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1220 (unwind-protect
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1221 (progn
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1222 (set-syntax-table scheme-mode-syntax-table)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1223 (let ((state (parse-partial-sexp start end)))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1224 (and (zerop (car state)) ;depth = 0
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1225 (nth 2 state) ;last-sexp exists, i.e. >= 1 sexps
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1226 (let ((state (parse-partial-sexp start (nth 2 state))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1227 (if (nth 2 state) 'many 'one)))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1228 (set-syntax-table old-syntax-table)))))
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1229
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1230 (provide 'xscheme)
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1231
4abe2802e78c Moved from lisp.
Dave Love <fx@gnu.org>
parents:
diff changeset
1232 ;;; xscheme.el ends here