]> code.delx.au - gnu-emacs/blobdiff - lisp/cmuscheme.el
Assorted cleanups for compiler warnings, doc strings, `array-' prefix
[gnu-emacs] / lisp / cmuscheme.el
index b817b42e6626ddda9c2d3672e33e1612e29276e7..a3e1ab5d9f72c7ab3ae53e80f88859950beaa166 100644 (file)
-;;; cmuscheme.el -- Scheme process in a buffer. Adapted from tea.el.
-;;; Copyright Olin Shivers (1988)
-;;; Please imagine a long, tedious, legalistic 5-page gnu-style copyright
-;;; notice appearing here to the effect that you may use this code any
-;;; way you like, as long as you don't charge money for it, remove this
-;;; notice, or hold me liable for its results.
-;;;
-;;;    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...
-
-;; YOUR .EMACS FILE
-;;=============================================================================
-;; Some suggestions for your .emacs file.
+;;; cmuscheme.el --- Scheme process in a buffer. Adapted from tea.el.
+
+;; Copyright (C) 1988, 1994, 1997 Free Software Foundation, Inc.
+
+;; Author: Olin Shivers <olin.shivers@cs.cmu.edu>
+;; Maintainer: FSF
+;; Keywords: processes, lisp
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; 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, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;    This is a customisation of comint-mode (see comint.el)
 ;;
-;; ; If cmuscheme lives in some non-standard directory, you must tell emacs
-;; ; where to get it. This may or may not be necessary.
-;; (setq load-path (cons (expand-file-name "~jones/lib/emacs") load-path))
+;; 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
 ;;
-;; ; Autoload run-scheme from file cmuscheme.el
-;; (autoload 'run-scheme "cmuscheme"
-;;           "Run an inferior Scheme process."
-;;           t)
+;; Please send me bug reports, bug fixes, and extensions, so that I can
+;; merge them into the master source.
 ;;
-;; ; Files ending in ".scm" are Scheme source, 
-;; ; so put their buffers in scheme-mode.
-;; (setq auto-mode-alist 
-;;       (cons '("\\.scm$" . scheme-mode)  
-;;             auto-mode-alist))
+;; The changelog is at the end of this file.
 ;;
-;; ; Define C-c t to run my favorite command in inferior scheme mode:
-;; (setq cmuscheme-load-hook
-;;       '((lambda () (define-key inferior-scheme-mode-map "\C-ct"
-;;                                'favorite-cmd))))
+;; 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. 
 ;;;
-;;; Unfortunately, scheme.el defines run-scheme to autoload from xscheme.el.
-;;; This will womp your declaration to autoload run-scheme from cmuscheme.el
-;;; if you haven't loaded cmuscheme in before scheme. Three fixes:
-;;; - Put the autoload on your scheme mode hook and in your .emacs toplevel:
-;;;   (setq scheme-mode-hook
-;;;         '((lambda () (autoload 'run-scheme "cmuscheme"
-;;;                                "Run an inferior Scheme" t))))
-;;;   (autoload 'run-scheme "cmuscheme" "Run an inferior Scheme" t)
-;;;   Now when scheme.el autoloads, it will restore the run-scheme autoload.
-;;; - Load cmuscheme.el in your .emacs: (load-library 'cmuscheme)
-;;; - Change autoload declaration in scheme.el to point to cmuscheme.el:
-;;;   (autoload 'run-scheme "cmuscheme" "Run an inferior Scheme" t)
-;;;   *or* just delete the autoload declaration from scheme.el altogether,
-;;;   which will allow the autoload in your .emacs to have its say.
+;;; 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.
+
+;;; 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)
        (setq inferior-scheme-mode-map
-            (full-copy-sparse-keymap comint-mode-map))
+            (copy-keymap comint-mode-map))
        (define-key inferior-scheme-mode-map "\M-\C-x" ;gnu convention
                   'scheme-send-definition)
        (define-key inferior-scheme-mode-map "\C-x\C-e" 'scheme-send-last-sexp)
 (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 ()
   "Major mode for interacting with an inferior Scheme process.
 
@@ -157,25 +200,26 @@ to continue it."
   (interactive)
   (comint-mode)
   ;; Customise in inferior-scheme-mode-hook
-  (setq comint-prompt-regexp "^[^>]*>+ *") ; OK for cscheme, oaklisp, T,...
+  (setq comint-prompt-regexp "^[^>\n]*>+ *") ; OK for cscheme, oaklisp, T,...
   (scheme-mode-variables)
   (setq major-mode 'inferior-scheme-mode)
   (setq mode-name "Inferior Scheme")
-  (setq mode-line-process '(": %s"))
+  (setq mode-line-process '(":%s"))
   (use-local-map inferior-scheme-mode-map)
   (setq comint-input-filter (function scheme-input-filter))
-  (setq comint-input-sentinel (function ignore))
   (setq comint-get-old-input (function scheme-get-old-input))
   (run-hooks 'inferior-scheme-mode-hook))
 
+(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."
+  :type 'regexp
+  :group 'cmuscheme)
+
 (defun scheme-input-filter (str)
   "Don't save anything matching inferior-scheme-filter-regexp"
   (not (string-match inferior-scheme-filter-regexp str)))
 
-(defvar 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.")
-
 (defun scheme-get-old-input ()
   "Snarf the sexp ending at point"
   (save-excursion
@@ -196,22 +240,18 @@ 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")
-
-;;; Obsolete
-(defun scheme (&rest foo)
-  "Use run-scheme"
-  (interactive)
-  (message "Use run-scheme")
-  (ding))
+(defcustom scheme-program-name "scheme"
+  "*Program invoked by the run-scheme command"
+  :type 'string
+  :group 'cmuscheme)
 
+;;;###autoload
 (defun run-scheme (cmd)
   "Run an inferior Scheme process, input and output via buffer *scheme*.
-If there is a process already running in *scheme*, just switch to that buffer.
+If there is a process already running in `*scheme*', switch to that buffer.
 With argument, allows you to edit the command line (default is value
-of scheme-program-name).  Runs the hooks from inferior-scheme-mode-hook
-\(after the comint-mode-hook is run).
+of `scheme-program-name').  Runs the hooks `inferior-scheme-mode-hook'
+\(after the `comint-mode-hook' is run).
 \(Type \\[describe-mode] in the process buffer for a list of commands.)"
 
   (interactive (list (if current-prefix-arg
@@ -222,9 +262,10 @@ of scheme-program-name).  Runs the hooks from inferior-scheme-mode-hook
        (set-buffer (apply 'make-comint "scheme" (car cmdlist)
                           nil (cdr cmdlist)))
        (inferior-scheme-mode)))
+  (setq scheme-program-name cmd)
   (setq scheme-buffer "*scheme*")
-  (switch-to-buffer "*scheme*"))
-
+  (pop-to-buffer "*scheme*"))
+;;;###autoload (add-hook 'same-window-buffer-names "*scheme*")
 
 (defun scheme-send-region (start end)
   "Send the current region to the inferior Scheme process."
@@ -246,11 +287,13 @@ of scheme-program-name).  Runs the hooks from 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
+  "Compile the current region in the inferior Scheme process.
 \(A BEGIN is wrapped around the region: (BEGIN <region>))"
   (interactive "r")
   (comint-send-string (scheme-proc) (format scheme-compile-exp-command
@@ -279,41 +322,44 @@ With argument, positions cursor at end of buffer."
         (goto-char (point-max)))))
 
 (defun scheme-send-region-and-go (start end)
-  "Send the current region to the inferior Scheme process,
-and switch to the process buffer."
+  "Send the current region to the inferior Scheme process.
+Then switch to the process buffer."
   (interactive "r")
   (scheme-send-region start end)
   (switch-to-scheme t))
 
 (defun scheme-send-definition-and-go ()
-  "Send the current definition to the inferior Scheme, 
-and switch to the process buffer."
+  "Send the current definition to the inferior Scheme. 
+Then switch to the process buffer."
   (interactive)
   (scheme-send-definition)
   (switch-to-scheme t))
 
 (defun scheme-compile-definition-and-go ()
-  "Compile the current definition in the inferior Scheme, 
-and switch to the process buffer."
+  "Compile the current definition in the inferior Scheme. 
+Then switch to the process buffer."
   (interactive)
   (scheme-compile-definition)
   (switch-to-scheme t))
 
 (defun scheme-compile-region-and-go (start end)
-  "Compile the current region in the inferior Scheme, 
-and switch to the process buffer."
+  "Compile the current region in the inferior Scheme. 
+Then switch to the process buffer."
   (interactive "r")
   (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 (directory . file) pair used in the last scheme-load-file or
+  "Caches the last (directory . file) pair.
+Caches the last pair used in the last scheme-load-file or
 scheme-compile-file command. Used for determining the default in the 
 next one.")
 
@@ -378,7 +424,7 @@ to be the new process's buffer. If you only run one process, this will
 do the right thing. If you run multiple processes, you can change
 scheme-buffer to another process buffer with \\[set-variable].
 
-More sophisticated approaches are, of course, possible. If you find youself
+More sophisticated approaches are, of course, possible. If you find yourself
 needing to switch back and forth between multiple processes frequently,
 you may wish to consider ilisp.el, a larger, more sophisticated package
 for running inferior Lisp and Scheme processes. The approach taken here is
@@ -395,37 +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