X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/349a5b097bef1b204f1b8e76dbe6d1d7633d83c0..efa434d9f2720aa71fbc67fed5897a2f16943fde:/lisp/cmuscheme.el diff --git a/lisp/cmuscheme.el b/lisp/cmuscheme.el index 3a3cd0bb07..a3e1ab5d9f 100644 --- a/lisp/cmuscheme.el +++ b/lisp/cmuscheme.el @@ -1,6 +1,6 @@ ;;; cmuscheme.el --- Scheme process in a buffer. Adapted from tea.el. -;; Copyright (C) 1988, 1994 Free Software Foundation, Inc. +;; Copyright (C) 1988, 1994, 1997 Free Software Foundation, Inc. ;; Author: Olin Shivers ;; Maintainer: FSF @@ -19,61 +19,96 @@ ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to -;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. ;;; Commentary: -;;; This is a customisation of comint-mode (see comint.el) -;;; -;;; Written by Olin Shivers (olin.shivers@cs.cmu.edu). With bits and pieces -;;; lifted from scheme.el, shell.el, clisp.el, newclisp.el, cobol.el, et al.. -;;; 8/88 +;; This is a customisation of comint-mode (see comint.el) +;; +;; Written by Olin Shivers (olin.shivers@cs.cmu.edu). With bits and pieces +;; lifted from scheme.el, shell.el, clisp.el, newclisp.el, cobol.el, et al.. +;; 8/88 +;; +;; Please send me bug reports, bug fixes, and extensions, so that I can +;; merge them into the master source. +;; +;; The changelog is at the end of this file. +;; +;; NOTE: MIT Cscheme, when invoked with the -emacs flag, has a special user +;; interface that communicates process state back to the superior emacs by +;; outputting special control sequences. The gnumacs package, xscheme.el, has +;; lots and lots of special purpose code to read these control sequences, and +;; so is very tightly integrated with the cscheme process. The cscheme +;; interrupt handler and debugger read single character commands in cbreak +;; mode; when this happens, xscheme.el switches to special keymaps that bind +;; the single letter command keys to emacs functions that directly send the +;; character to the scheme process. Cmuscheme mode does *not* provide this +;; functionality. If you are a cscheme user, you may prefer to use the +;; xscheme.el/cscheme -emacs interaction. +;; +;; Here's a summary of the pros and cons, as I see them. +;; xscheme: Tightly integrated with inferior cscheme process! A few commands +;; not in cmuscheme. But. Integration is a bit of a hack. Input +;; history only keeps the immediately prior input. Bizarre +;; keybindings. +;; +;; cmuscheme: Not tightly integrated with inferior cscheme process. But. +;; Carefully integrated functionality with the entire suite of +;; comint-derived CMU process modes. Keybindings reminiscent of +;; Zwei and Hemlock. Good input history. A few commands not in +;; xscheme. +;; +;; It's a tradeoff. Pay your money; take your choice. If you use a Scheme +;; that isn't Cscheme, of course, there isn't a choice. Xscheme.el is *very* +;; Cscheme-specific; you must use cmuscheme.el. Interested parties are +;; invited to port xscheme functionality on top of comint mode... + +;;; CHANGE LOG +;;; =========================================================================== +;;; 8/88 Olin +;;; Created. ;;; -;;; Please send me bug reports, bug fixes, and extensions, so that I can -;;; merge them into the master source. +;;; 2/15/89 Olin +;;; Removed -emacs flag from process invocation. It's only useful for +;;; cscheme, and makes cscheme assume it's running under xscheme.el, +;;; which messes things up royally. A bug. ;;; -;;; The changelog is at the end of this file. +;;; 5/22/90 Olin +;;; - Upgraded to use comint-send-string and comint-send-region. +;;; - run-scheme now offers to let you edit the command line if +;;; you invoke it with a prefix-arg. M-x scheme is redundant, and +;;; has been removed. +;;; - Explicit references to process "scheme" have been replaced with +;;; (scheme-proc). This allows better handling of multiple process bufs. +;;; - Added scheme-send-last-sexp, bound to C-x C-e. A gnu convention. +;;; - Have not added process query facility a la cmulisp.el's lisp-show-arglist +;;; and friends, but interested hackers might find a useful application +;;; of this facility. ;;; -;;; NOTE: MIT Cscheme, when invoked with the -emacs flag, has a special user -;;; interface that communicates process state back to the superior emacs by -;;; outputting special control sequences. The gnumacs package, xscheme.el, has -;;; lots and lots of special purpose code to read these control sequences, and -;;; so is very tightly integrated with the cscheme process. The cscheme -;;; interrupt handler and debugger read single character commands in cbreak -;;; mode; when this happens, xscheme.el switches to special keymaps that bind -;;; the single letter command keys to emacs functions that directly send the -;;; character to the scheme process. Cmuscheme mode does *not* provide this -;;; functionality. If you are a cscheme user, you may prefer to use the -;;; xscheme.el/cscheme -emacs interaction. -;;; -;;; Here's a summary of the pros and cons, as I see them. -;;; xscheme: Tightly integrated with inferior cscheme process! A few commands -;;; not in cmuscheme. But. Integration is a bit of a hack. Input -;;; history only keeps the immediately prior input. Bizarre -;;; keybindings. -;;; -;;; cmuscheme: Not tightly integrated with inferior cscheme process. But. -;;; Carefully integrated functionality with the entire suite of -;;; comint-derived CMU process modes. Keybindings reminiscent of -;;; Zwei and Hemlock. Good input history. A few commands not in -;;; xscheme. -;;; -;;; It's a tradeoff. Pay your money; take your choice. If you use a Scheme -;;; that isn't Cscheme, of course, there isn't a choice. Xscheme.el is *very* -;;; Cscheme-specific; you must use cmuscheme.el. Interested parties are -;;; invited to port xscheme functionality on top of comint mode... +;;; 3/12/90 Olin +;;; - scheme-load-file and scheme-compile-file no longer switch-to-scheme. +;;; Tale suggested this. ;;; Code: (require 'scheme) (require 'comint) + +(defgroup cmuscheme nil + "Run a scheme process in a buffer." + :group 'lisp) + ;;; INFERIOR SCHEME MODE STUFF ;;;============================================================================ -(defvar inferior-scheme-mode-hook nil - "*Hook for customising inferior-scheme mode.") +(defcustom inferior-scheme-mode-hook nil + "*Hook for customising inferior-scheme mode." + :type 'hook + :group 'cmuscheme) + (defvar inferior-scheme-mode-map nil) (cond ((not inferior-scheme-mode-map) @@ -99,6 +134,30 @@ (define-key scheme-mode-map "\C-c\C-l" 'scheme-load-file) (define-key scheme-mode-map "\C-c\C-k" 'scheme-compile-file) ;k for "kompile" +(let ((map (lookup-key scheme-mode-map [menu-bar scheme]))) + (define-key map [separator-eval] '("--")) + (define-key map [compile-file] + '("Compile Scheme File" . scheme-compile-file)) + (define-key map [load-file] + '("Load Scheme File" . scheme-load-file)) + (define-key map [switch] + '("Switch to Scheme" . switch-to-scheme)) + (define-key map [com-def-go] + '("Compile Definitiion & Go" . scheme-compile-definition-and-go)) + (define-key map [com-def] + '("Compile Definitiion" . scheme-compile-definition)) + (define-key map [send-def-go] + '("Evaluate Last Definition & Go" . scheme-send-definition-and-go)) + (define-key map [send-def] + '("Evaluate Last Definition" . scheme-send-definition)) + (define-key map [send-region-go] + '("Evaluate Region & Go" . scheme-send-region-and-go)) + (define-key map [send-region] + '("Evaluate Region" . scheme-send-region)) + (define-key map [send-sexp] + '("Evaluate Last S-expression" . scheme-send-last-sexp)) +) + (defvar scheme-buffer) (defun inferior-scheme-mode () @@ -151,9 +210,11 @@ to continue it." (setq comint-get-old-input (function scheme-get-old-input)) (run-hooks 'inferior-scheme-mode-hook)) -(defvar inferior-scheme-filter-regexp "\\`\\s *\\S ?\\S ?\\s *\\'" +(defcustom inferior-scheme-filter-regexp "\\`\\s *\\S ?\\S ?\\s *\\'" "*Input matching this regexp are not saved on the history list. -Defaults to a regexp ignoring all inputs of 0, 1, or 2 letters.") +Defaults to a regexp ignoring all inputs of 0, 1, or 2 letters." + :type 'regexp + :group 'cmuscheme) (defun scheme-input-filter (str) "Don't save anything matching inferior-scheme-filter-regexp" @@ -179,8 +240,10 @@ Defaults to a regexp ignoring all inputs of 0, 1, or 2 letters.") (scheme-args-to-list (substring string pos (length string))))))))) -(defvar scheme-program-name "scheme" - "*Program invoked by the run-scheme command") +(defcustom scheme-program-name "scheme" + "*Program invoked by the run-scheme command" + :type 'string + :group 'cmuscheme) ;;;###autoload (defun run-scheme (cmd) @@ -224,8 +287,10 @@ of `scheme-program-name'). Runs the hooks `inferior-scheme-mode-hook' (interactive) (scheme-send-region (save-excursion (backward-sexp) (point)) (point))) -(defvar scheme-compile-exp-command "(compile '%s)" - "*Template for issuing commands to compile arbitrary Scheme expressions.") +(defcustom scheme-compile-exp-command "(compile '%s)" + "*Template for issuing commands to compile arbitrary Scheme expressions." + :type 'string + :group 'cmuscheme) (defun scheme-compile-region (start end) "Compile the current region in the inferior Scheme process. @@ -284,11 +349,13 @@ Then switch to the process buffer." (scheme-compile-region start end) (switch-to-scheme t)) -(defvar scheme-source-modes '(scheme-mode) +(defcustom scheme-source-modes '(scheme-mode) "*Used to determine if a buffer contains Scheme source code. If it's loaded into a buffer that is in one of these major modes, it's considered a scheme source file by scheme-load-file and scheme-compile-file. -Used by these commands to determine defaults.") +Used by these commands to determine defaults." + :type '(repeat function) + :group 'cmuscheme) (defvar scheme-prev-l/c-dir/file nil "Caches the last (directory . file) pair. @@ -374,39 +441,14 @@ for a minimal, simple implementation. Feel free to extend it.") ;;; Do the user's customisation... -(defvar cmuscheme-load-hook nil +(defcustom cmuscheme-load-hook nil "This hook is run when cmuscheme is loaded in. -This is a good place to put keybindings.") +This is a good place to put keybindings." + :type 'hook + :group 'cmuscheme) (run-hooks 'cmuscheme-load-hook) - -;;; CHANGE LOG -;;; =========================================================================== -;;; 8/88 Olin -;;; Created. -;;; -;;; 2/15/89 Olin -;;; Removed -emacs flag from process invocation. It's only useful for -;;; cscheme, and makes cscheme assume it's running under xscheme.el, -;;; which messes things up royally. A bug. -;;; -;;; 5/22/90 Olin -;;; - Upgraded to use comint-send-string and comint-send-region. -;;; - run-scheme now offers to let you edit the command line if -;;; you invoke it with a prefix-arg. M-x scheme is redundant, and -;;; has been removed. -;;; - Explicit references to process "scheme" have been replaced with -;;; (scheme-proc). This allows better handling of multiple process bufs. -;;; - Added scheme-send-last-sexp, bound to C-x C-e. A gnu convention. -;;; - Have not added process query facility a la cmulisp.el's lisp-show-arglist -;;; and friends, but interested hackers might find a useful application -;;; of this facility. -;;; -;;; 3/12/90 Olin -;;; - scheme-load-file and scheme-compile-file no longer switch-to-scheme. -;;; Tale suggested this. - (provide 'cmuscheme) ;;; cmuscheme.el ends here