|
|
1.1 root 1: ;;; -*-Emacs-Lisp-*- Scheme under emacs stuff.
2: ;; Copyright (C) 1985 Bill Rozas & Richard M. Stallman
3:
4: ;; This file is part of GNU Emacs.
5:
6: ;; GNU Emacs is distributed in the hope that it will be useful,
7: ;; but WITHOUT ANY WARRANTY. No author or distributor
8: ;; accepts responsibility to anyone for the consequences of using it
9: ;; or for whether it serves any particular purpose or works at all,
10: ;; unless he says so in writing. Refer to the GNU Emacs General Public
11: ;; License for full details.
12:
13: ;; Everyone is granted permission to copy, modify and redistribute
14: ;; GNU Emacs, but only under the conditions described in the
15: ;; GNU Emacs General Public License. A copy of this license is
16: ;; supposed to have been given to you along with GNU Emacs so you
17: ;; can know your rights and responsibilities. It should be in a
18: ;; file named COPYING. Among other things, the copyright notice
19: ;; and this notice must be preserved on all copies.
20:
21: ;; Adapted from shell.el to scheme.
22: ;; Note: It only works with Cscheme release 4 or later.
23:
24: (require 'scheme)
25: (require 'shell)
26:
27: (defvar inferior-scheme-mode-map nil)
28: (if inferior-scheme-mode-map
29: nil
30: (setq inferior-scheme-mode-map (copy-alist shell-mode-map))
31: (define-key inferior-scheme-mode-map "\C-c\C-a" 'quit-shell-subjob)
32: (define-key inferior-scheme-mode-map "\C-c\C-g" 'interrupt-shell-subjob)
33: (define-key inferior-scheme-mode-map "\e\C-g" 'interrupt-shell-subjob)
34: (scheme-mode-commands inferior-scheme-mode-map))
35:
36: (defun inferior-scheme-mode ()
37: "Major mode for interacting with an inferior Scheme process.
38:
39: The following commands are available:
40: \\{inferior-scheme-mode-map}
41:
42: Entry to this mode calls the value of scheme-mode-hook with no arguments,
43: if that value is non-nil. Likewise with the value of shell-mode-hook.
44: scheme-mode-hook is called after shell-mode-hook.
45:
46: You can send text to the inferior Scheme from other buffers
47: using the commands send-region, send-string and \\[scheme-send-definition].
48:
49: Commands:
50: Delete converts tabs to spaces as it moves back.
51: Tab indents for Scheme; with argument, shifts rest
52: of expression rigidly with the current line.
53: Meta-Control-Q does Tab on each line starting within following expression.
54: Paragraphs are separated only by blank lines. Semicolons start comments.
55:
56: Return at end of buffer sends line as input.
57: Return not at end copies rest of line to end and sends it.
58: C-d at end of buffer sends end-of-file as input.
59: C-d not at end or with arg deletes or kills characters.
60: C-u and C-w are kill commands, imitating normal Unix input editing.
61: C-c interrupts the shell or its current subjob if any.
62: C-z stops, likewise. C-\\ sends quit signal, likewise.
63:
64: C-x C-k deletes last batch of output from shell.
65: C-x C-v puts top of last batch of output at top of window."
66: (interactive)
67: (kill-all-local-variables)
68: (setq major-mode 'inferior-scheme-mode)
69: (setq mode-name "Inferior Scheme")
70: (setq mode-line-format
71: "--%1*%1*-Emacs: %17b %M %[(%m: %s)%]----%3p--%-")
72: (scheme-mode-variables)
73: (use-local-map inferior-scheme-mode-map)
74: (make-local-variable 'last-input-start)
75: (setq last-input-start (make-marker))
76: (make-local-variable 'last-input-end)
77: (setq last-input-end (make-marker))
78: (run-hooks 'shell-mode-hook 'scheme-mode-hook))
79:
80: (defun args-to-list (string)
81: (let ((where (string-match "[ \t]" string)))
82: (cond ((null where) (list string))
83: ((not (= where 0))
84: (cons (substring string 0 where)
85: (args-to-list (substring string (+ 1 where)
86: (length string)))))
87: (t (let ((pos (string-match "[^ \t]" string)))
88: (if (null pos)
89: nil
90: (args-to-list (substring string pos (length string)))))))))
91:
92: (defconst scheme-program-name "scheme"
93: "Program invoked by the scheme and run-scheme commands")
94:
95: (defun scheme (arg)
96: "Run an inferior Scheme process reading a command line from the terminal."
97: (interactive "sExtra arguments to scheme: ")
98: (switch-to-buffer
99: (apply 'make-shell (append (list "scheme" scheme-program-name nil)
100: (args-to-list arg)
101: '("-emacs"))))
102: (inferior-scheme-mode))
103:
104: (defun run-scheme (arg)
105: "Run an inferior Scheme process.
106: Input and output via buffer *scheme*.
107: With argument it asks for a command line."
108: (interactive "P")
109: (if arg (call-interactively 'scheme)
110: (switch-to-buffer (make-shell "scheme" scheme-program-name nil "-emacs"))
111: (inferior-scheme-mode)))
112:
113: (defun scheme-send-definition ()
114: "Send the current definition to the Scheme process made by M-x run-scheme."
115: (interactive)
116: (save-excursion
117: (end-of-defun)
118: (let ((end (point)))
119: (beginning-of-defun)
120: (send-region "scheme" (point) end)
121: (send-string "scheme" "\n"))))
122:
123: (defun scheme-send-definition-and-go ()
124: "Send the current definition to the inferior Scheme, and switch to *scheme* buffer."
125: (interactive)
126: (scheme-send-definition)
127: (switch-to-buffer "*scheme*"))
128:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.