Commit 61c11870 authored by Juanma Barranquero's avatar Juanma Barranquero
Browse files

* ielm.el (ielm-noisy, ielm-dynamic-return, ielm-mode-hook)

  (ielm-dynamic-multiline-inputs): Remove * from defcustom docstrings.
  (ielm-prompt-read-only, ielm-font-lock-keywords): Fix docstring typos.
  (ielm-map): Define within defvar.  Add docstring.
  (ielm-tab, ielm-eval-input, ielm-get-old-input, ielm-return)
  (ielm-complete-filename): Use `when', `unless'.
  (ielm-is-whitespace-or-comment): Use `string-match-p'.
  (ielm-return, ielm-get-old-input): Use `looking-at-p'.
  (ielm-change-working-buffer): Check that the buffer is live.
  (inferior-emacs-lisp-mode): Define with `define-derived-mode'.
  Simplify.  Reflow docstring.
  (inferior-emacs-lisp-mode-hook, inferior-emacs-lisp-mode-map):
  New aliases, to satisfy `define-derived-mode' expectations.
parent 801a8da1
2008-11-16 Juanma Barranquero <lekktu@gmail.com>
* ielm.el (ielm-noisy, ielm-dynamic-return, ielm-mode-hook)
(ielm-dynamic-multiline-inputs): Remove * from defcustom docstrings.
(ielm-prompt-read-only, ielm-font-lock-keywords): Fix docstring typos.
(ielm-map): Define within defvar. Add docstring.
(ielm-tab, ielm-eval-input, ielm-get-old-input, ielm-return)
(ielm-complete-filename): Use `when', `unless'.
(ielm-is-whitespace-or-comment): Use `string-match-p'.
(ielm-return, ielm-get-old-input): Use `looking-at-p'.
(ielm-change-working-buffer): Check that the buffer is live.
(inferior-emacs-lisp-mode): Define with `define-derived-mode'.
Simplify. Reflow docstring.
(inferior-emacs-lisp-mode-hook, inferior-emacs-lisp-mode-map):
New aliases, to satisfy `define-derived-mode' expectations.
2008-11-15 Glenn Morris <rgm@gnu.org> 2008-11-15 Glenn Morris <rgm@gnu.org>
Martin Rudalics <rudalics@gmx.at> Martin Rudalics <rudalics@gmx.at>
   
...@@ -31,8 +47,7 @@ ...@@ -31,8 +47,7 @@
   
2008-11-14 Karl Fogel <kfogel@red-bean.com> 2008-11-14 Karl Fogel <kfogel@red-bean.com>
   
* files.el (file-precious-flag): Document that this flag is * files.el (file-precious-flag): Document that this flag is advisory.
advisory.
   
2008-11-14 Shigeru Fukaya <shigeru.fukaya@gmail.com> 2008-11-14 Shigeru Fukaya <shigeru.fukaya@gmail.com>
   
......
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
(defcustom ielm-noisy t (defcustom ielm-noisy t
"*If non-nil, IELM will beep on error." "If non-nil, IELM will beep on error."
:type 'boolean :type 'boolean
:group 'ielm) :group 'ielm)
...@@ -56,7 +56,7 @@ This works by setting the buffer-local value of `comint-prompt-read-only'. ...@@ -56,7 +56,7 @@ This works by setting the buffer-local value of `comint-prompt-read-only'.
Setting that value directly affects new prompts in the current buffer. Setting that value directly affects new prompts in the current buffer.
If this option is enabled, then the safe way to temporarily If this option is enabled, then the safe way to temporarily
override the read-only-ness of ielm prompts is to call override the read-only-ness of IELM prompts is to call
`comint-kill-whole-line' or `comint-kill-region' with no `comint-kill-whole-line' or `comint-kill-region' with no
narrowing in effect. This way you will be certain that none of narrowing in effect. This way you will be certain that none of
the remaining prompts will be accidentally messed up. You may the remaining prompts will be accidentally messed up. You may
...@@ -71,7 +71,7 @@ wish to put something like the following in your `.emacs' file: ...@@ -71,7 +71,7 @@ wish to put something like the following in your `.emacs' file:
If you set `comint-prompt-read-only' to t, you might wish to use If you set `comint-prompt-read-only' to t, you might wish to use
`comint-mode-hook' and `comint-mode-map' instead of `comint-mode-hook' and `comint-mode-map' instead of
`ielm-mode-hook' and `ielm-map'. That will affect all comint `ielm-mode-hook' and `ielm-map'. That will affect all comint
buffers, including ielm buffers. If you sometimes use ielm on buffers, including IELM buffers. If you sometimes use IELM on
text-only terminals or with `emacs -nw', you might wish to use text-only terminals or with `emacs -nw', you might wish to use
another binding for `comint-kill-whole-line'." another binding for `comint-kill-whole-line'."
:type 'boolean :type 'boolean
...@@ -101,14 +101,14 @@ prevent a running IELM process from being messed up when the user ...@@ -101,14 +101,14 @@ prevent a running IELM process from being messed up when the user
customizes `ielm-prompt'.") customizes `ielm-prompt'.")
(defcustom ielm-dynamic-return t (defcustom ielm-dynamic-return t
"*Controls whether \\<ielm-map>\\[ielm-return] has intelligent behavior in IELM. "Controls whether \\<ielm-map>\\[ielm-return] has intelligent behavior in IELM.
If non-nil, \\[ielm-return] evaluates input for complete sexps, or inserts a newline If non-nil, \\[ielm-return] evaluates input for complete sexps, or inserts a newline
and indents for incomplete sexps. If nil, always inserts newlines." and indents for incomplete sexps. If nil, always inserts newlines."
:type 'boolean :type 'boolean
:group 'ielm) :group 'ielm)
(defcustom ielm-dynamic-multiline-inputs t (defcustom ielm-dynamic-multiline-inputs t
"*Force multiline inputs to start from column zero? "Force multiline inputs to start from column zero?
If non-nil, after entering the first line of an incomplete sexp, a newline If non-nil, after entering the first line of an incomplete sexp, a newline
will be inserted after the prompt, moving the input to the next line. will be inserted after the prompt, moving the input to the next line.
This gives more frame width for large indented sexps, and allows functions This gives more frame width for large indented sexps, and allows functions
...@@ -117,10 +117,11 @@ such as `edebug-defun' to work with such inputs." ...@@ -117,10 +117,11 @@ such as `edebug-defun' to work with such inputs."
:group 'ielm) :group 'ielm)
(defcustom ielm-mode-hook nil (defcustom ielm-mode-hook nil
"*Hooks to be run when IELM (`inferior-emacs-lisp-mode') is started." "Hooks to be run when IELM (`inferior-emacs-lisp-mode') is started."
:options '(turn-on-eldoc-mode) :options '(turn-on-eldoc-mode)
:type 'hook :type 'hook
:group 'ielm) :group 'ielm)
(defvaralias 'inferior-emacs-lisp-mode-hook 'ielm-mode-hook)
(defvar * nil (defvar * nil
"Most recent value evaluated in IELM.") "Most recent value evaluated in IELM.")
...@@ -165,45 +166,40 @@ This variable is buffer-local.") ...@@ -165,45 +166,40 @@ This variable is buffer-local.")
"*** Welcome to IELM *** Type (describe-mode) for help.\n" "*** Welcome to IELM *** Type (describe-mode) for help.\n"
"Message to display when IELM is started.") "Message to display when IELM is started.")
(defvar ielm-map nil) (defvar ielm-map
(if ielm-map nil (let ((map (make-sparse-keymap)))
(if (featurep 'xemacs) (define-key map "\t" 'comint-dynamic-complete)
;; Lemacs (define-key map "\C-m" 'ielm-return)
(progn (define-key map "\C-j" 'ielm-send-input)
(setq ielm-map (make-sparse-keymap)) (define-key map "\e\C-x" 'eval-defun) ; for consistency with
(set-keymap-parent ielm-map comint-mode-map)) (define-key map "\e\t" 'lisp-complete-symbol) ; lisp-interaction-mode
;; FSF ;; These bindings are from `lisp-mode-shared-map' -- can you inherit
(setq ielm-map (cons 'keymap comint-mode-map))) ;; from more than one keymap??
(define-key ielm-map "\t" 'comint-dynamic-complete) (define-key map "\e\C-q" 'indent-sexp)
(define-key ielm-map "\C-m" 'ielm-return) (define-key map "\177" 'backward-delete-char-untabify)
(define-key ielm-map "\C-j" 'ielm-send-input) ;; Some convenience bindings for setting the working buffer
(define-key ielm-map "\e\C-x" 'eval-defun) ; for consistency with (define-key map "\C-c\C-b" 'ielm-change-working-buffer)
(define-key ielm-map "\e\t" 'lisp-complete-symbol) ; lisp-interaction-mode (define-key map "\C-c\C-f" 'ielm-display-working-buffer)
;; These bindings are from `lisp-mode-shared-map' -- can you inherit (define-key map "\C-c\C-v" 'ielm-print-working-buffer)
;; from more than one keymap?? map)
(define-key ielm-map "\e\C-q" 'indent-sexp) "Keymap for IELM mode.")
(define-key ielm-map "\177" 'backward-delete-char-untabify) (defvaralias 'inferior-emacs-lisp-mode-map 'ielm-map)
;; Some convenience bindings for setting the working buffer
(define-key ielm-map "\C-c\C-b" 'ielm-change-working-buffer)
(define-key ielm-map "\C-c\C-f" 'ielm-display-working-buffer)
(define-key ielm-map "\C-c\C-v" 'ielm-print-working-buffer))
(defvar ielm-font-lock-keywords (defvar ielm-font-lock-keywords
'(("\\(^\\*\\*\\*[^*]+\\*\\*\\*\\)\\(.*$\\)" '(("\\(^\\*\\*\\*[^*]+\\*\\*\\*\\)\\(.*$\\)"
(1 font-lock-comment-face) (1 font-lock-comment-face)
(2 font-lock-constant-face))) (2 font-lock-constant-face)))
"Additional expressions to highlight in ielm buffers.") "Additional expressions to highlight in IELM buffers.")
;;; Completion stuff ;;; Completion stuff
(defun ielm-tab nil (defun ielm-tab nil
"Possibly indent the current line as Lisp code." "Possibly indent the current line as Lisp code."
(interactive) (interactive)
(if (or (eq (preceding-char) ?\n) (when (or (eq (preceding-char) ?\n)
(eq (char-syntax (preceding-char)) ? )) (eq (char-syntax (preceding-char)) ?\s))
(progn (ielm-indent-line)
(ielm-indent-line) t))
t)))
(defun ielm-complete-symbol nil (defun ielm-complete-symbol nil
"Complete the Lisp symbol before point." "Complete the Lisp symbol before point."
...@@ -224,8 +220,8 @@ This variable is buffer-local.") ...@@ -224,8 +220,8 @@ This variable is buffer-local.")
(defun ielm-complete-filename nil (defun ielm-complete-filename nil
"Dynamically complete filename before point, if in a string." "Dynamically complete filename before point, if in a string."
(if (nth 3 (parse-partial-sexp comint-last-input-start (point))) (when (nth 3 (parse-partial-sexp comint-last-input-start (point)))
(comint-dynamic-complete-filename))) (comint-dynamic-complete-filename)))
(defun ielm-indent-line nil (defun ielm-indent-line nil
"Indent the current line as Lisp code if it is not a prompt line." "Indent the current line as Lisp code if it is not a prompt line."
...@@ -253,7 +249,10 @@ This is the buffer in which all sexps entered at the IELM prompt are ...@@ -253,7 +249,10 @@ This is the buffer in which all sexps entered at the IELM prompt are
evaluated. You can achieve the same effect with a call to evaluated. You can achieve the same effect with a call to
`set-buffer' at the IELM prompt." `set-buffer' at the IELM prompt."
(interactive "bSet working buffer to: ") (interactive "bSet working buffer to: ")
(setq ielm-working-buffer (or (get-buffer buf) (error "No such buffer"))) (let ((buffer (get-buffer buf)))
(if (and buffer (buffer-live-p buffer))
(setq ielm-working-buffer buffer)
(error "No such buffer: %S" buf)))
(ielm-print-working-buffer)) (ielm-print-working-buffer))
;;; Other bindings ;;; Other bindings
...@@ -272,13 +271,13 @@ simply inserts a newline." ...@@ -272,13 +271,13 @@ simply inserts a newline."
(point))))) (point)))))
(if (and (< (car state) 1) (not (nth 3 state))) (if (and (< (car state) 1) (not (nth 3 state)))
(ielm-send-input) (ielm-send-input)
(if (and ielm-dynamic-multiline-inputs (when (and ielm-dynamic-multiline-inputs
(save-excursion (save-excursion
(beginning-of-line) (beginning-of-line)
(looking-at comint-prompt-regexp))) (looking-at-p comint-prompt-regexp)))
(save-excursion (save-excursion
(goto-char (ielm-pm)) (goto-char (ielm-pm))
(newline 1))) (newline 1)))
(newline-and-indent))) (newline-and-indent)))
(newline))) (newline)))
...@@ -300,8 +299,8 @@ simply inserts a newline." ...@@ -300,8 +299,8 @@ simply inserts a newline."
(defun ielm-is-whitespace-or-comment (string) (defun ielm-is-whitespace-or-comment (string)
"Return non-nil if STRING is all whitespace or a comment." "Return non-nil if STRING is all whitespace or a comment."
(or (string= string "") (or (string= string "")
(string-match "\\`[ \t\n]*\\(?:;.*\\)*\\'" string))) (string-match-p "\\`[ \t\n]*\\(?:;.*\\)*\\'" string)))
;;; Evaluation ;;; Evaluation
...@@ -323,100 +322,97 @@ simply inserts a newline." ...@@ -323,100 +322,97 @@ simply inserts a newline."
ielm-pos ; End posn of parse in string ielm-pos ; End posn of parse in string
ielm-result ; Result, or error message ielm-result ; Result, or error message
ielm-error-type ; string, nil if no error ielm-error-type ; string, nil if no error
(ielm-output "") ; result to display (ielm-output "") ; result to display
(ielm-wbuf ielm-working-buffer) ; current buffer after evaluation (ielm-wbuf ielm-working-buffer) ; current buffer after evaluation
(ielm-pmark (ielm-pm))) (ielm-pmark (ielm-pm)))
(if (not (ielm-is-whitespace-or-comment ielm-string)) (unless (ielm-is-whitespace-or-comment ielm-string)
(progn (condition-case err
(condition-case err (let ((rout (read-from-string ielm-string)))
(let (rout) (setq ielm-form (car rout)
(setq rout (read-from-string ielm-string)) ielm-pos (cdr rout)))
(setq ielm-form (car rout)) (error (setq ielm-result (error-message-string err))
(setq ielm-pos (cdr rout))) (setq ielm-error-type "Read error")))
(error (setq ielm-result (error-message-string err)) (unless ielm-error-type
(setq ielm-error-type "Read error"))) ;; Make sure working buffer has not been killed
(if ielm-error-type nil (if (not (buffer-name ielm-working-buffer))
;; Make sure working buffer has not been killed (setq ielm-result "Working buffer has been killed"
(if (not (buffer-name ielm-working-buffer)) ielm-error-type "IELM Error"
(setq ielm-result "Working buffer has been killed" ielm-wbuf (current-buffer))
ielm-error-type "IELM Error" (if (ielm-is-whitespace-or-comment (substring ielm-string ielm-pos))
ielm-wbuf (current-buffer)) ;; To correctly handle the ielm-local variables *,
(if (ielm-is-whitespace-or-comment ;; ** and ***, we need a temporary buffer to be
(substring ielm-string ielm-pos)) ;; current at entry to the inner of the next two let
;; To correctly handle the ielm-local variables *, ;; forms. We need another temporary buffer to exit
;; ** and ***, we need a temporary buffer to be ;; that same let. To avoid problems, neither of
;; current at entry to the inner of the next two let ;; these buffers should be alive during the
;; forms. We need another temporary buffer to exit ;; evaluation of ielm-form.
;; that same let. To avoid problems, neither of (let ((*1 *)
;; these buffers should be alive during the (*2 **)
;; evaluation of ielm-form. (*3 ***)
(let ((*1 *) ielm-temp-buffer)
(*2 **) (set-match-data ielm-match-data)
(*3 ***) (save-excursion
ielm-temp-buffer) (with-temp-buffer
(set-match-data ielm-match-data) (condition-case err
(save-excursion (unwind-protect
(with-temp-buffer ;; The next let form creates default
(condition-case err ;; bindings for *, ** and ***. But
(unwind-protect ;; these default bindings are
;; The next let form creates default ;; identical to the ielm-local
;; bindings for *, ** and ***. But ;; bindings. Hence, during the
;; these default bindings are ;; evaluation of ielm-form, the
;; identical to the ielm-local ;; ielm-local values are going to be
;; bindings. Hence, during the ;; used in all buffers except for
;; evaluation of ielm-form, the ;; other ielm buffers, which override
;; ielm-local values are going to be ;; them. Normally, the variables *1,
;; used in all buffers except for ;; *2 and *3 also have default
;; other ielm buffers, which override ;; bindings, which are not overridden.
;; them. Normally, the variables *1, (let ((* *1)
;; *2 and *3 also have default (** *2)
;; bindings, which are not overridden. (*** *3))
(let ((* *1) (kill-buffer (current-buffer))
(** *2) (set-buffer ielm-wbuf)
(*** *3)) (setq ielm-result (eval ielm-form))
(kill-buffer (current-buffer)) (setq ielm-wbuf (current-buffer))
(set-buffer ielm-wbuf) (setq
(setq ielm-result (eval ielm-form)) ielm-temp-buffer
(setq ielm-wbuf (current-buffer)) (generate-new-buffer " *ielm-temp*"))
(setq (set-buffer ielm-temp-buffer))
ielm-temp-buffer (when ielm-temp-buffer
(generate-new-buffer " *ielm-temp*")) (kill-buffer ielm-temp-buffer)))
(set-buffer ielm-temp-buffer)) (error (setq ielm-result (error-message-string err))
(when ielm-temp-buffer (setq ielm-error-type "Eval error"))
(kill-buffer ielm-temp-buffer))) (quit (setq ielm-result "Quit during evaluation")
(error (setq ielm-result (error-message-string err)) (setq ielm-error-type "Eval error")))))
(setq ielm-error-type "Eval error")) (setq ielm-match-data (match-data)))
(quit (setq ielm-result "Quit during evaluation") (setq ielm-error-type "IELM error")
(setq ielm-error-type "Eval error"))))) (setq ielm-result "More than one sexp in input"))))
(setq ielm-match-data (match-data)))
(setq ielm-error-type "IELM error") ;; If the eval changed the current buffer, mention it here
(setq ielm-result "More than one sexp in input")))) (when (eq ielm-wbuf ielm-working-buffer)
(message "current buffer is now: %s" ielm-wbuf)
;; If the eval changed the current buffer, mention it here (setq ielm-working-buffer ielm-wbuf))
(if (eq ielm-wbuf ielm-working-buffer) nil
(message "current buffer is now: %s" ielm-wbuf) (goto-char ielm-pmark)
(setq ielm-working-buffer ielm-wbuf)) (unless ielm-error-type
(condition-case err
(goto-char ielm-pmark) ;; Self-referential objects cause loops in the printer, so
(if (not ielm-error-type) ;; trap quits here. May as well do errors, too
(condition-case err (setq ielm-output (concat ielm-output (pp-to-string ielm-result)))
;; Self-referential objects cause loops in the printer, so (error (setq ielm-error-type "IELM Error")
;; trap quits here. May as well do errors, too (setq ielm-result "Error during pretty-printing (bug in pp)"))
(setq ielm-output (concat ielm-output (pp-to-string ielm-result))) (quit (setq ielm-error-type "IELM Error")
(error (setq ielm-error-type "IELM Error") (setq ielm-result "Quit during pretty-printing"))))
(setq ielm-result "Error during pretty-printing (bug in pp)")) (if ielm-error-type
(quit (setq ielm-error-type "IELM Error") (progn
(setq ielm-result "Quit during pretty-printing")))) (when ielm-noisy (ding))
(if ielm-error-type (setq ielm-output (concat ielm-output "*** " ielm-error-type " *** "))
(progn (setq ielm-output (concat ielm-output ielm-result)))
(if ielm-noisy (ding)) ;; There was no error, so shift the *** values
(setq ielm-output (concat ielm-output "*** " ielm-error-type " *** ")) (setq *** **)
(setq ielm-output (concat ielm-output ielm-result))) (setq ** *)
;; There was no error, so shift the *** values (setq * ielm-result))
(setq *** **) (setq ielm-output (concat ielm-output "\n")))
(setq ** *)
(setq * ielm-result))
(setq ielm-output (concat ielm-output "\n"))))
(setq ielm-output (concat ielm-output ielm-prompt-internal)) (setq ielm-output (concat ielm-output ielm-prompt-internal))
(comint-output-filter (ielm-process) ielm-output))) (comint-output-filter (ielm-process) ielm-output)))
...@@ -436,9 +432,7 @@ simply inserts a newline." ...@@ -436,9 +432,7 @@ simply inserts a newline."
;;; Major mode ;;; Major mode
(put 'inferior-emacs-lisp-mode 'mode-class 'special) (define-derived-mode inferior-emacs-lisp-mode comint-mode "IELM"
(defun inferior-emacs-lisp-mode nil
"Major mode for interactively evaluating Emacs Lisp expressions. "Major mode for interactively evaluating Emacs Lisp expressions.
Uses the interface provided by `comint-mode' (which see). Uses the interface provided by `comint-mode' (which see).
...@@ -453,12 +447,12 @@ Uses the interface provided by `comint-mode' (which see). ...@@ -453,12 +447,12 @@ Uses the interface provided by `comint-mode' (which see).
* \\[comint-dynamic-complete] completes Lisp symbols (or filenames, within strings), * \\[comint-dynamic-complete] completes Lisp symbols (or filenames, within strings),
or indents the line if there is nothing to complete. or indents the line if there is nothing to complete.
The current working buffer may be changed (with a call to The current working buffer may be changed (with a call to `set-buffer',
`set-buffer', or with \\[ielm-change-working-buffer]), and its value or with \\[ielm-change-working-buffer]), and its value is preserved between successive
is preserved between successive evaluations. In this way, expressions evaluations. In this way, expressions may be evaluated in a different
may be evaluated in a different buffer than the *ielm* buffer. buffer than the *ielm* buffer. By default, its name is shown on the
By default, its name is shown on the mode line; you can always display mode line; you can always display it with \\[ielm-print-working-buffer], or the buffer itself
it with \\[ielm-print-working-buffer], or the buffer itself with \\[ielm-display-working-buffer]. with \\[ielm-display-working-buffer].
During evaluations, the values of the variables `*', `**', and `***' During evaluations, the values of the variables `*', `**', and `***'
are the results of the previous, second previous and third previous are the results of the previous, second previous and third previous
...@@ -480,49 +474,35 @@ The behavior of IELM may be customized with the following variables: ...@@ -480,49 +474,35 @@ The behavior of IELM may be customized with the following variables:
Customized bindings may be defined in `ielm-map', which currently contains: Customized bindings may be defined in `ielm-map', which currently contains:
\\{ielm-map}" \\{ielm-map}"
(interactive) :syntax-table emacs-lisp-mode-syntax-table
(delay-mode-hooks
(comint-mode))
(setq comint-prompt-regexp (concat "^" (regexp-quote ielm-prompt))) (setq comint-prompt-regexp (concat "^" (regexp-quote ielm-prompt)))
(set (make-local-variable 'paragraph-separate) "\\'") (set (make-local-variable 'paragraph-separate) "\\'")
(make-local-variable 'paragraph-start) (set (make-local-variable 'paragraph-start) comint-prompt-regexp)
(setq paragraph-start comint-prompt-regexp)
(setq comint-input-sender 'ielm-input-sender) (setq comint-input-sender 'ielm-input-sender)
(setq comint-process-echoes nil) (setq comint-process-echoes nil)
(make-local-variable 'comint-dynamic-complete-functions) (set (make-local-variable 'comint-dynamic-complete-functions)
'(ielm-tab comint-replace-by-expanded-history
ielm-complete-filename ielm-complete-symbol))
(set (make-local-variable 'ielm-prompt-internal) ielm-prompt) (set (make-local-variable 'ielm-prompt-internal) ielm-prompt)
(set (make-local-variable 'comint-prompt-read-only) ielm-prompt-read-only) (set (make-local-variable 'comint-prompt-read-only) ielm-prompt-read-only)
(setq comint-dynamic-complete-functions
'(ielm-tab comint-replace-by-expanded-history ielm-complete-filename ielm-complete-symbol))
(setq comint-get-old-input 'ielm-get-old-input) (setq comint-get-old-input 'ielm-get-old-input)
(make-local-variable 'comint-completion-addsuffix) (set (make-local-variable 'comint-completion-addsuffix) '("/" . ""))
(setq comint-completion-addsuffix '("/" . ""))
(setq major-mode 'inferior-emacs-lisp-mode)
(setq mode-name "IELM")
(setq mode-line-process '(":%s on " (:eval (buffer-name ielm-working-buffer)))) (setq mode-line-process '(":%s on " (:eval (buffer-name ielm-working-buffer))))
(use-local-map ielm-map)
(set-syntax-table emacs-lisp-mode-syntax-table)
(make-local-variable 'indent-line-function) (set (make-local-variable 'indent-line-function) 'ielm-indent-line)
(make-local-variable 'ielm-working-buffer) (set (make-local-variable 'ielm-working-buffer) (current-buffer))
(setq ielm-working-buffer (current-buffer)) (set (make-local-variable 'fill-paragraph-function) 'lisp-fill-paragraph)
(setq indent-line-function 'ielm-indent-line)
(make-local-variable 'fill-paragraph-function)
(setq fill-paragraph-function 'lisp-fill-paragraph)
;; Value holders ;; Value holders
(make-local-variable '*) (set (make-local-variable '*) nil)
(setq * nil) (set (make-local-variable '**) nil)
(make-local-variable '**) (set (make-local-variable '***) nil)
(setq ** nil)
(make-local-variable '***)
(setq *** nil)
(set (make-local-variable 'ielm-match-data) nil) (set (make-local-variable 'ielm-match-data) nil)
;; font-lock support ;; font-lock support
(make-local-variable 'font-lock-defaults) (set (make-local-variable 'font-lock-defaults)
(setq font-lock-defaults '(ielm-font-lock-keywords nil nil ((?: . "w") (?- . "w") (?* . "w"))))
'(ielm-font-lock-keywords nil nil ((?: . "w") (?- . "w") (?* . "w"))))
;; A dummy process to keep comint happy. It will never get any input ;; A dummy process to keep comint happy. It will never get any input
(unless (comint-check-proc (current-buffer)) (unless (comint-check-proc (current-buffer))
...@@ -548,15 +528,13 @@ Customized bindings may be defined in `ielm-map', which currently contains: ...@@ -548,15 +528,13 @@ Customized bindings may be defined in `ielm-map', which currently contains:
'(rear-nonsticky t field output inhibit-line-move-field-capture t)))) '(rear-nonsticky t field output inhibit-line-move-field-capture t))))
(comint-output-filter (ielm-process) ielm-prompt-internal) (comint-output-filter (ielm-process) ielm-prompt-internal)
(set-marker comint-last-input-start (ielm-pm)) (set-marker comint-last-input-start (ielm-pm))
(set-process-filter (get-buffer-process (current-buffer)) 'comint-output-filter)) (set-process-filter (get-buffer-process (current-buffer)) 'comint-output-filter)))
(run-mode-hooks 'ielm-mode-hook))
(defun ielm-get-old-input nil (defun ielm-get-old-input nil
;; Return the previous input surrounding point ;; Return the previous input surrounding point
(save-excursion (save-excursion
(beginning-of-line) (beginning-of-line)
(if (looking-at comint-prompt-regexp) nil (unless (looking-at-p comint-prompt-regexp)
(re-search-backward comint-prompt-regexp)) (re-search-backward comint-prompt-regexp))
(comint-skip-prompt) (comint-skip-prompt)
(buffer-substring (point) (progn (forward-sexp 1) (point))))) (buffer-substring (point) (progn (forward-sexp 1) (point)))))
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment