X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/64e9342958694825be1664890dcd22fffcd50d3a..29c72a6e4382d33779f7706719cb784ee4c4ef88:/lisp/progmodes/inf-lisp.el diff --git a/lisp/progmodes/inf-lisp.el b/lisp/progmodes/inf-lisp.el index 13bc7f0899..ee5e2a49ea 100644 --- a/lisp/progmodes/inf-lisp.el +++ b/lisp/progmodes/inf-lisp.el @@ -1,16 +1,17 @@ ;;; inf-lisp.el --- an inferior-lisp mode -;; Copyright (C) 1988, 1993, 1994 Free Software Foundation, Inc. +;; Copyright (C) 1988, 1993, 1994, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 +;; Free Software Foundation, Inc. ;; Author: Olin Shivers ;; Keywords: processes, lisp ;; This file is part of GNU Emacs. -;; GNU Emacs is free software; you can redistribute it and/or modify +;; 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. +;; the Free Software Foundation, either version 3 of the License, 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 @@ -18,9 +19,7 @@ ;; 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. +;; along with GNU Emacs. If not, see . ;;; Commentary: @@ -73,7 +72,7 @@ ;;;###autoload (defcustom inferior-lisp-filter-regexp - "\\`\\s *\\(:\\(\\w\\|\\s_\\)\\)?\\s *\\'" + (purecopy "\\`\\s *\\(:\\(\\w\\|\\s_\\)\\)?\\s *\\'") "*What not to save on inferior Lisp's input history. Input matching this regexp is not saved on the input history in Inferior Lisp mode. Default is whitespace followed by 0 or 1 single-letter colon-keyword @@ -142,13 +141,13 @@ mode. Default is whitespace followed by 0 or 1 single-letter colon-keyword 'lisp-show-variable-documentation)) ;;;###autoload -(defcustom inferior-lisp-program "lisp" +(defcustom inferior-lisp-program (purecopy "lisp") "*Program name for invoking an inferior Lisp in Inferior Lisp mode." :type 'string :group 'inferior-lisp) ;;;###autoload -(defcustom inferior-lisp-load-command "(load \"%s\")\n" +(defcustom inferior-lisp-load-command (purecopy "(load \"%s\")\n") "*Format-string for building a Lisp expression to load a file. This format string should use `%s' to substitute a file name and should result in a Lisp expression that will command the inferior Lisp @@ -160,8 +159,8 @@ but it works only in Common Lisp." :group 'inferior-lisp) ;;;###autoload -(defcustom inferior-lisp-prompt "^[^> \n]*>+:? *" - "Regexp to recognise prompts in the Inferior Lisp mode. +(defcustom inferior-lisp-prompt (purecopy "^[^> \n]*>+:? *") + "Regexp to recognize prompts in the Inferior Lisp mode. Defaults to \"^[^> \\n]*>+:? *\", which works pretty good for Lucid, kcl, and franz. This variable is used to initialize `comint-prompt-regexp' in the Inferior Lisp buffer. @@ -215,7 +214,7 @@ buffer with \\[set-variable].") ;;;###autoload (defvar inferior-lisp-mode-hook '() - "*Hook for customising Inferior Lisp mode.") + "*Hook for customizing Inferior Lisp mode.") (put 'inferior-lisp-mode 'mode-class 'special) @@ -232,35 +231,43 @@ documentation for variable `inferior-lisp-buffer'. \\{inferior-lisp-mode-map} -Customisation: Entry to this mode runs the hooks on `comint-mode-hook' and +Customization: Entry to this mode runs the hooks on `comint-mode-hook' and `inferior-lisp-mode-hook' (in that order). You can send text to the inferior Lisp process from other buffers containing Lisp source. - switch-to-lisp switches the current buffer to the Lisp process buffer. - lisp-eval-defun sends the current defun to the Lisp process. - lisp-compile-defun compiles the current defun. - lisp-eval-region sends the current region to the Lisp process. - lisp-compile-region compiles the current region. + `switch-to-lisp' switches the current buffer to the Lisp process buffer. + `lisp-eval-defun' sends the current defun to the Lisp process. + `lisp-compile-defun' compiles the current defun. + `lisp-eval-region' sends the current region to the Lisp process. + `lisp-compile-region' compiles the current region. Prefixing the lisp-eval/compile-defun/region commands with a \\[universal-argument] causes a switch to the Lisp process buffer after sending the text. -Commands: -Return after the end of the process' output sends the text from the +Commands:\\ +\\[comint-send-input] after the end of the process' output sends the text from the end of process to point. -Return before the end of the process' output copies the sexp ending at point +\\[comint-send-input] before the end of the process' output copies the sexp ending at point to the end of the process' output, and sends it. -Delete converts tabs to spaces as it moves back. -Tab indents for Lisp; with argument, shifts rest +\\[comint-copy-old-input] copies the sexp ending at point to the end of the process' output, + allowing you to edit it before sending it. +If `comint-use-prompt-regexp' is nil (the default), \\[comint-insert-input] on old input + copies the entire old input to the end of the process' output, allowing + you to edit it before sending it. When not used on old input, or if + `comint-use-prompt-regexp' is non-nil, \\[comint-insert-input] behaves according to + its global binding. +\\[backward-delete-char-untabify] converts tabs to spaces as it moves back. +\\[lisp-indent-line] indents for Lisp; with argument, shifts rest of expression rigidly with the current line. -C-M-q does Tab on each line starting within following expression. +\\[indent-sexp] does \\[lisp-indent-line] on each line starting within following expression. Paragraphs are separated only by blank lines. Semicolons start comments. If you accidentally suspend your process, use \\[comint-continue-subjob] to continue it." (interactive) - (comint-mode) + (delay-mode-hooks + (comint-mode)) (setq comint-prompt-regexp inferior-lisp-prompt) (setq major-mode 'inferior-lisp-mode) (setq mode-name "Inferior Lisp") @@ -269,7 +276,7 @@ to continue it." (use-local-map inferior-lisp-mode-map) ;c-c c-k for "kompile" file (setq comint-get-old-input (function lisp-get-old-input)) (setq comint-input-filter (function lisp-input-filter)) - (run-hooks 'inferior-lisp-mode-hook)) + (run-mode-hooks 'inferior-lisp-mode-hook)) (defun lisp-get-old-input () "Return a string containing the sexp ending at point." @@ -301,7 +308,7 @@ of `inferior-lisp-program'). Runs the hooks from (inferior-lisp-mode))) (setq inferior-lisp-buffer "*inferior-lisp*") (pop-to-buffer "*inferior-lisp*")) -;;;###autoload (add-hook 'same-window-buffer-names "*inferior-lisp*") +;;;###autoload (add-hook 'same-window-buffer-names (purecopy "*inferior-lisp*")) ;;;###autoload (defalias 'run-lisp 'inferior-lisp) @@ -314,16 +321,40 @@ Prefix argument means switch to the Lisp buffer afterwards." (comint-send-string (inferior-lisp-proc) "\n") (if and-go (switch-to-lisp t))) -(defun lisp-eval-defun (&optional and-go) +(defun lisp-compile-string (string) + "Send the string to the inferior Lisp process to be compiled and executed." + (comint-send-string + (inferior-lisp-proc) + (format "(funcall (compile nil (lambda () %s)))\n" string))) + +(defun lisp-eval-string (string) + "Send the string to the inferior Lisp process to be executed." + (comint-send-string (inferior-lisp-proc) (concat string "\n"))) + +(defun lisp-do-defun (do-string do-region) "Send the current defun to the inferior Lisp process. -Prefix argument means switch to the Lisp buffer afterwards." - (interactive "P") +The actually processing is done by `do-string' and `do-region' + which determine whether the code is compiled before evaluation. +DEFVAR forms reset the variables to the init values." (save-excursion (end-of-defun) (skip-chars-backward " \t\n\r\f") ; Makes allegro happy - (let ((end (point))) + (let ((end (point)) (case-fold-search t)) (beginning-of-defun) - (lisp-eval-region (point) end))) + (if (looking-at "(defvar") + (funcall do-string + ;; replace `defvar' with `defparameter' + (concat "(defparameter " + (buffer-substring-no-properties (+ (point) 7) end) + "\n")) + (funcall do-region (point) end))))) + +(defun lisp-eval-defun (&optional and-go) + "Send the current defun to the inferior Lisp process. +DEFVAR forms reset the variables to the init values. +Prefix argument means switch to the Lisp buffer afterwards." + (interactive "P") + (lisp-do-defun 'lisp-eval-string 'lisp-eval-region) (if and-go (switch-to-lisp t))) (defun lisp-eval-last-sexp (&optional and-go) @@ -332,27 +363,19 @@ Prefix argument means switch to the Lisp buffer afterwards." (interactive "P") (lisp-eval-region (save-excursion (backward-sexp) (point)) (point) and-go)) -;;; Common Lisp COMPILE sux. (defun lisp-compile-region (start end &optional and-go) "Compile the current region in the inferior Lisp process. Prefix argument means switch to the Lisp buffer afterwards." (interactive "r\nP") - (comint-send-string - (inferior-lisp-proc) - (format "(funcall (compile nil `(lambda () (progn 'compile %s))))\n" - (buffer-substring start end))) + (lisp-compile-string (buffer-substring-no-properties start end)) (if and-go (switch-to-lisp t))) (defun lisp-compile-defun (&optional and-go) "Compile the current defun in the inferior Lisp process. +DEFVAR forms reset the variables to the init values. Prefix argument means switch to the Lisp buffer afterwards." (interactive "P") - (save-excursion - (end-of-defun) - (skip-chars-backward " \t\n\r\f") ; Makes allegro happy - (let ((e (point))) - (beginning-of-defun) - (lisp-compile-region (point) e))) + (lisp-do-defun 'lisp-compile-string 'lisp-compile-region) (if and-go (switch-to-lisp t))) (defun switch-to-lisp (eob-p) @@ -639,5 +662,5 @@ See variable `lisp-describe-sym-command'." (provide 'inf-lisp) -;;; arch-tag: 5b74abc3-a085-4b91-8ab8-8da6899d3b92 +;; arch-tag: 5b74abc3-a085-4b91-8ab8-8da6899d3b92 ;;; inf-lisp.el ends here