changeset 99594:f7610a7d319c

* 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.
author Juanma Barranquero <lekktu@gmail.com>
date Sun, 16 Nov 2008 04:54:05 +0000
parents 7ea6aba09239
children eb7532b56b78
files lisp/ChangeLog lisp/ielm.el
diffstat 2 files changed, 173 insertions(+), 180 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Sun Nov 16 04:44:42 2008 +0000
+++ b/lisp/ChangeLog	Sun Nov 16 04:54:05 2008 +0000
@@ -1,3 +1,19 @@
+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>
             Martin Rudalics  <rudalics@gmx.at>
 
@@ -31,8 +47,7 @@
 
 2008-11-14  Karl Fogel  <kfogel@red-bean.com>
 
-	* files.el (file-precious-flag): Document that this flag is
-	advisory.
+	* files.el (file-precious-flag): Document that this flag is advisory.
 
 2008-11-14  Shigeru Fukaya  <shigeru.fukaya@gmail.com>
 
--- a/lisp/ielm.el	Sun Nov 16 04:44:42 2008 +0000
+++ b/lisp/ielm.el	Sun Nov 16 04:54:05 2008 +0000
@@ -44,7 +44,7 @@
 
 
 (defcustom ielm-noisy t
-  "*If non-nil, IELM will beep on error."
+  "If non-nil, IELM will beep on error."
   :type 'boolean
   :group 'ielm)
 
@@ -56,7 +56,7 @@
 Setting that value directly affects new prompts in the current buffer.
 
 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
 narrowing in effect.  This way you will be certain that none of
 the remaining prompts will be accidentally messed up.  You may
@@ -71,7 +71,7 @@
 If you set `comint-prompt-read-only' to t, you might wish to use
 `comint-mode-hook' and `comint-mode-map' instead of
 `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
 another binding for `comint-kill-whole-line'."
   :type 'boolean
@@ -101,14 +101,14 @@
 customizes `ielm-prompt'.")
 
 (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
 and indents for incomplete sexps.  If nil, always inserts newlines."
   :type 'boolean
   :group 'ielm)
 
 (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
 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
@@ -117,10 +117,11 @@
   :group 'ielm)
 
 (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)
   :type 'hook
   :group 'ielm)
+(defvaralias 'inferior-emacs-lisp-mode-hook 'ielm-mode-hook)
 
 (defvar * nil
   "Most recent value evaluated in IELM.")
@@ -165,45 +166,40 @@
   "*** Welcome to IELM ***  Type (describe-mode) for help.\n"
   "Message to display when IELM is started.")
 
-(defvar ielm-map nil)
-(if ielm-map nil
-  (if (featurep 'xemacs)
-      ;; Lemacs
-      (progn
-	(setq ielm-map (make-sparse-keymap))
-	(set-keymap-parent ielm-map comint-mode-map))
-    ;; FSF
-    (setq ielm-map (cons 'keymap comint-mode-map)))
-  (define-key ielm-map "\t" 'comint-dynamic-complete)
-  (define-key ielm-map "\C-m" 'ielm-return)
-  (define-key ielm-map "\C-j" 'ielm-send-input)
-  (define-key ielm-map "\e\C-x" 'eval-defun)         ; for consistency with
-  (define-key ielm-map "\e\t" 'lisp-complete-symbol) ; lisp-interaction-mode
-  ;; These bindings are from `lisp-mode-shared-map' -- can you inherit
-  ;; from more than one keymap??
-  (define-key ielm-map "\e\C-q" 'indent-sexp)
-  (define-key ielm-map "\177" 'backward-delete-char-untabify)
-  ;; 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-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\t" 'comint-dynamic-complete)
+    (define-key map "\C-m" 'ielm-return)
+    (define-key map "\C-j" 'ielm-send-input)
+    (define-key map "\e\C-x" 'eval-defun)         ; for consistency with
+    (define-key map "\e\t" 'lisp-complete-symbol) ; lisp-interaction-mode
+    ;; These bindings are from `lisp-mode-shared-map' -- can you inherit
+    ;; from more than one keymap??
+    (define-key map "\e\C-q" 'indent-sexp)
+    (define-key map "\177" 'backward-delete-char-untabify)
+    ;; Some convenience bindings for setting the working buffer
+    (define-key map "\C-c\C-b" 'ielm-change-working-buffer)
+    (define-key map "\C-c\C-f" 'ielm-display-working-buffer)
+    (define-key map "\C-c\C-v" 'ielm-print-working-buffer)
+    map)
+  "Keymap for IELM mode.")
+(defvaralias 'inferior-emacs-lisp-mode-map 'ielm-map)
 
 (defvar ielm-font-lock-keywords
   '(("\\(^\\*\\*\\*[^*]+\\*\\*\\*\\)\\(.*$\\)"
      (1 font-lock-comment-face)
      (2 font-lock-constant-face)))
-  "Additional expressions to highlight in ielm buffers.")
+  "Additional expressions to highlight in IELM buffers.")
 
 ;;; Completion stuff
 
 (defun ielm-tab nil
   "Possibly indent the current line as Lisp code."
   (interactive)
-  (if (or (eq (preceding-char) ?\n)
-	  (eq (char-syntax (preceding-char)) ? ))
-      (progn
-	(ielm-indent-line)
-	t)))
+  (when (or (eq (preceding-char) ?\n)
+	    (eq (char-syntax (preceding-char)) ?\s))
+    (ielm-indent-line)
+    t))
 
 (defun ielm-complete-symbol nil
   "Complete the Lisp symbol before point."
@@ -224,8 +220,8 @@
 
 (defun ielm-complete-filename nil
   "Dynamically complete filename before point, if in a string."
-  (if (nth 3 (parse-partial-sexp comint-last-input-start (point)))
-      (comint-dynamic-complete-filename)))
+  (when (nth 3 (parse-partial-sexp comint-last-input-start (point)))
+    (comint-dynamic-complete-filename)))
 
 (defun ielm-indent-line nil
   "Indent the current line as Lisp code if it is not a prompt line."
@@ -253,7 +249,10 @@
 evaluated.  You can achieve the same effect with a call to
 `set-buffer' at the IELM prompt."
   (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))
 
 ;;; Other bindings
@@ -272,13 +271,13 @@
 				   (point)))))
 	(if (and (< (car state) 1) (not (nth 3 state)))
 	    (ielm-send-input)
-	  (if (and ielm-dynamic-multiline-inputs
-		   (save-excursion
-		     (beginning-of-line)
-		     (looking-at comint-prompt-regexp)))
-	      (save-excursion
-		(goto-char (ielm-pm))
-		(newline 1)))
+	  (when (and ielm-dynamic-multiline-inputs
+		     (save-excursion
+		       (beginning-of-line)
+		       (looking-at-p comint-prompt-regexp)))
+	    (save-excursion
+	      (goto-char (ielm-pm))
+	      (newline 1)))
 	  (newline-and-indent)))
     (newline)))
 
@@ -300,8 +299,8 @@
 
 (defun ielm-is-whitespace-or-comment (string)
   "Return non-nil if STRING is all whitespace or a comment."
-  (or (string= string "") 
-      (string-match "\\`[ \t\n]*\\(?:;.*\\)*\\'" string)))
+  (or (string= string "")
+      (string-match-p "\\`[ \t\n]*\\(?:;.*\\)*\\'" string)))
 
 ;;; Evaluation
 
@@ -323,100 +322,97 @@
 	ielm-pos			; End posn of parse in string
 	ielm-result			; Result, or error message
 	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-pmark (ielm-pm)))
-    (if (not (ielm-is-whitespace-or-comment ielm-string))
-	(progn
-	  (condition-case err
-	      (let (rout)
-		(setq rout (read-from-string ielm-string))
-		(setq ielm-form (car rout))
-		(setq ielm-pos (cdr rout)))
-	    (error (setq ielm-result (error-message-string err))
-		   (setq ielm-error-type "Read error")))
-	  (if ielm-error-type nil
-	    ;; Make sure working buffer has not been killed
-	    (if (not (buffer-name ielm-working-buffer))
-		(setq ielm-result "Working buffer has been killed"
-		      ielm-error-type "IELM Error"
-		      ielm-wbuf (current-buffer))
-	      (if (ielm-is-whitespace-or-comment
-                   (substring ielm-string ielm-pos))
-		  ;; To correctly handle the ielm-local variables *,
-		  ;; ** and ***, we need a temporary buffer to be
-		  ;; current at entry to the inner of the next two let
-		  ;; forms.  We need another temporary buffer to exit
-		  ;; that same let.  To avoid problems, neither of
-		  ;; these buffers should be alive during the
-		  ;; evaluation of ielm-form.
-		  (let ((*1 *)
-			(*2 **)
-			(*3 ***)
-			ielm-temp-buffer)
-		    (set-match-data ielm-match-data)
-		    (save-excursion
-		      (with-temp-buffer
-			(condition-case err
-			    (unwind-protect
-				;; The next let form creates default
-				;; bindings for *, ** and ***.  But
-				;; these default bindings are
-				;; identical to the ielm-local
-				;; bindings.  Hence, during the
-				;; evaluation of ielm-form, the
-				;; ielm-local values are going to be
-				;; used in all buffers except for
-				;; other ielm buffers, which override
-				;; them.  Normally, the variables *1,
-				;; *2 and *3 also have default
-				;; bindings, which are not overridden.
-				(let ((* *1)
-				      (** *2)
-				      (*** *3))
-				  (kill-buffer (current-buffer))
-				  (set-buffer ielm-wbuf)
-				  (setq ielm-result (eval ielm-form))
-				  (setq ielm-wbuf (current-buffer))
-				  (setq
-				   ielm-temp-buffer
-				   (generate-new-buffer " *ielm-temp*"))
-				  (set-buffer ielm-temp-buffer))
-			      (when ielm-temp-buffer
-				(kill-buffer ielm-temp-buffer)))
-			  (error (setq ielm-result (error-message-string err))
-				 (setq ielm-error-type "Eval error"))
-			  (quit (setq ielm-result "Quit during evaluation")
-				(setq ielm-error-type "Eval error")))))
-		    (setq ielm-match-data (match-data)))
-		(setq ielm-error-type "IELM error")
-		(setq ielm-result "More than one sexp in input"))))
+    (unless (ielm-is-whitespace-or-comment ielm-string)
+      (condition-case err
+	  (let ((rout (read-from-string ielm-string)))
+	    (setq ielm-form (car rout)
+		  ielm-pos (cdr rout)))
+	(error (setq ielm-result (error-message-string err))
+	       (setq ielm-error-type "Read error")))
+      (unless ielm-error-type
+	;; Make sure working buffer has not been killed
+	(if (not (buffer-name ielm-working-buffer))
+	    (setq ielm-result "Working buffer has been killed"
+		  ielm-error-type "IELM Error"
+		  ielm-wbuf (current-buffer))
+	  (if (ielm-is-whitespace-or-comment (substring ielm-string ielm-pos))
+	      ;; To correctly handle the ielm-local variables *,
+	      ;; ** and ***, we need a temporary buffer to be
+	      ;; current at entry to the inner of the next two let
+	      ;; forms.  We need another temporary buffer to exit
+	      ;; that same let.  To avoid problems, neither of
+	      ;; these buffers should be alive during the
+	      ;; evaluation of ielm-form.
+	      (let ((*1 *)
+		    (*2 **)
+		    (*3 ***)
+		    ielm-temp-buffer)
+		(set-match-data ielm-match-data)
+		(save-excursion
+		  (with-temp-buffer
+		    (condition-case err
+			(unwind-protect
+			     ;; The next let form creates default
+			     ;; bindings for *, ** and ***.  But
+			     ;; these default bindings are
+			     ;; identical to the ielm-local
+			     ;; bindings.  Hence, during the
+			     ;; evaluation of ielm-form, the
+			     ;; ielm-local values are going to be
+			     ;; used in all buffers except for
+			     ;; other ielm buffers, which override
+			     ;; them.  Normally, the variables *1,
+			     ;; *2 and *3 also have default
+			     ;; bindings, which are not overridden.
+			     (let ((* *1)
+				   (** *2)
+				   (*** *3))
+			       (kill-buffer (current-buffer))
+			       (set-buffer ielm-wbuf)
+			       (setq ielm-result (eval ielm-form))
+			       (setq ielm-wbuf (current-buffer))
+			       (setq
+				ielm-temp-buffer
+				(generate-new-buffer " *ielm-temp*"))
+			       (set-buffer ielm-temp-buffer))
+			  (when ielm-temp-buffer
+			    (kill-buffer ielm-temp-buffer)))
+		      (error (setq ielm-result (error-message-string err))
+			     (setq ielm-error-type "Eval error"))
+		      (quit (setq ielm-result "Quit during evaluation")
+			    (setq ielm-error-type "Eval error")))))
+		(setq ielm-match-data (match-data)))
+	    (setq ielm-error-type "IELM error")
+	    (setq ielm-result "More than one sexp in input"))))
 
-	  ;; If the eval changed the current buffer, mention it here
-	  (if (eq ielm-wbuf ielm-working-buffer) nil
-	    (message "current buffer is now: %s" ielm-wbuf)
-	    (setq ielm-working-buffer ielm-wbuf))
+      ;; If the eval changed the current buffer, mention it here
+      (when (eq ielm-wbuf ielm-working-buffer)
+	(message "current buffer is now: %s" ielm-wbuf)
+	(setq ielm-working-buffer ielm-wbuf))
 
-	  (goto-char ielm-pmark)
-	  (if (not ielm-error-type)
-	      (condition-case err
-		  ;; Self-referential objects cause loops in the printer, so
-		  ;; trap quits here. May as well do errors, too
-		  (setq ielm-output (concat ielm-output (pp-to-string ielm-result)))
-		(error (setq ielm-error-type "IELM Error")
-		       (setq ielm-result  "Error during pretty-printing (bug in pp)"))
-		(quit  (setq ielm-error-type "IELM Error")
-		       (setq ielm-result "Quit during pretty-printing"))))
-	  (if ielm-error-type
-	      (progn
-		(if ielm-noisy (ding))
-		(setq ielm-output (concat ielm-output "*** " ielm-error-type " ***  "))
-		(setq ielm-output (concat ielm-output ielm-result)))
-	    ;; There was no error, so shift the *** values
-	    (setq *** **)
-	    (setq ** *)
-	    (setq * ielm-result))
-	  (setq ielm-output (concat ielm-output "\n"))))
+      (goto-char ielm-pmark)
+      (unless ielm-error-type
+	(condition-case err
+	    ;; Self-referential objects cause loops in the printer, so
+	    ;; trap quits here. May as well do errors, too
+	    (setq ielm-output (concat ielm-output (pp-to-string ielm-result)))
+	  (error (setq ielm-error-type "IELM Error")
+		 (setq ielm-result "Error during pretty-printing (bug in pp)"))
+	  (quit  (setq ielm-error-type "IELM Error")
+		 (setq ielm-result "Quit during pretty-printing"))))
+      (if ielm-error-type
+	  (progn
+	    (when ielm-noisy (ding))
+	    (setq ielm-output (concat ielm-output "*** " ielm-error-type " ***  "))
+	    (setq ielm-output (concat ielm-output ielm-result)))
+	;; There was no error, so shift the *** values
+	(setq *** **)
+	(setq ** *)
+	(setq * ielm-result))
+      (setq ielm-output (concat ielm-output "\n")))
     (setq ielm-output (concat ielm-output ielm-prompt-internal))
     (comint-output-filter (ielm-process) ielm-output)))
 
@@ -436,9 +432,7 @@
 
 ;;; Major mode
 
-(put 'inferior-emacs-lisp-mode 'mode-class 'special)
-
-(defun inferior-emacs-lisp-mode nil
+(define-derived-mode inferior-emacs-lisp-mode comint-mode "IELM"
   "Major mode for interactively evaluating Emacs Lisp expressions.
 Uses the interface provided by `comint-mode' (which see).
 
@@ -453,12 +447,12 @@
 * \\[comint-dynamic-complete] completes Lisp symbols (or filenames, within strings),
   or indents the line if there is nothing to complete.
 
-The current working buffer may be changed (with a call to
-`set-buffer', or with \\[ielm-change-working-buffer]), and its value
-is preserved between successive evaluations.  In this way, expressions
-may be evaluated in a different buffer than the *ielm* buffer.
-By default, its name is shown on the mode line; you can always display
-it with \\[ielm-print-working-buffer], or the buffer itself with \\[ielm-display-working-buffer].
+The current working buffer may be changed (with a call to `set-buffer',
+or with \\[ielm-change-working-buffer]), and its value is preserved between successive
+evaluations.  In this way, expressions may be evaluated in a different
+buffer than the *ielm* buffer.  By default, its name is shown on the
+mode line; you can always display it with \\[ielm-print-working-buffer], or the buffer itself
+with \\[ielm-display-working-buffer].
 
 During evaluations, the values of the variables `*', `**', and `***'
 are the results of the previous, second previous and third previous
@@ -480,49 +474,35 @@
 
 Customized bindings may be defined in `ielm-map', which currently contains:
 \\{ielm-map}"
-  (interactive)
-  (delay-mode-hooks
-   (comint-mode))
+  :syntax-table emacs-lisp-mode-syntax-table
+
   (setq comint-prompt-regexp (concat "^" (regexp-quote ielm-prompt)))
   (set (make-local-variable 'paragraph-separate) "\\'")
-  (make-local-variable 'paragraph-start)
-  (setq paragraph-start comint-prompt-regexp)
+  (set (make-local-variable 'paragraph-start) comint-prompt-regexp)
   (setq comint-input-sender 'ielm-input-sender)
   (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 '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)
-  (make-local-variable 'comint-completion-addsuffix)
-  (setq comint-completion-addsuffix '("/" . ""))
-  (setq major-mode 'inferior-emacs-lisp-mode)
-  (setq mode-name "IELM")
+  (set (make-local-variable 'comint-completion-addsuffix) '("/" . ""))
   (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)
-  (make-local-variable 'ielm-working-buffer)
-  (setq ielm-working-buffer (current-buffer))
-  (setq indent-line-function 'ielm-indent-line)
-  (make-local-variable 'fill-paragraph-function)
-  (setq fill-paragraph-function 'lisp-fill-paragraph)
+  (set (make-local-variable 'indent-line-function) 'ielm-indent-line)
+  (set (make-local-variable 'ielm-working-buffer) (current-buffer))
+  (set (make-local-variable 'fill-paragraph-function) 'lisp-fill-paragraph)
 
   ;; Value holders
-  (make-local-variable '*)
-  (setq * nil)
-  (make-local-variable '**)
-  (setq ** nil)
-  (make-local-variable '***)
-  (setq *** nil)
+  (set (make-local-variable '*) nil)
+  (set (make-local-variable '**) nil)
+  (set (make-local-variable '***) nil)
   (set (make-local-variable 'ielm-match-data) nil)
 
   ;; font-lock support
-  (make-local-variable 'font-lock-defaults)
-  (setq font-lock-defaults
-	'(ielm-font-lock-keywords nil nil ((?: . "w") (?- . "w") (?* . "w"))))
+  (set (make-local-variable 'font-lock-defaults)
+       '(ielm-font-lock-keywords nil nil ((?: . "w") (?- . "w") (?* . "w"))))
 
   ;; A dummy process to keep comint happy. It will never get any input
   (unless (comint-check-proc (current-buffer))
@@ -548,15 +528,13 @@
          '(rear-nonsticky t field output inhibit-line-move-field-capture t))))
     (comint-output-filter (ielm-process) ielm-prompt-internal)
     (set-marker comint-last-input-start (ielm-pm))
-    (set-process-filter (get-buffer-process (current-buffer)) 'comint-output-filter))
-
-  (run-mode-hooks 'ielm-mode-hook))
+    (set-process-filter (get-buffer-process (current-buffer)) 'comint-output-filter)))
 
 (defun ielm-get-old-input nil
   ;; Return the previous input surrounding point
   (save-excursion
     (beginning-of-line)
-    (if (looking-at comint-prompt-regexp) nil
+    (unless (looking-at-p comint-prompt-regexp)
       (re-search-backward comint-prompt-regexp))
     (comint-skip-prompt)
     (buffer-substring (point) (progn (forward-sexp 1) (point)))))