From: Daniel Colascione <dancol@dancol.org>
To: Emacs development discussions <emacs-devel@gnu.org>
Subject: ielm changes: display standard-output in buffer
Date: Thu, 26 Sep 2013 11:13:46 -0700 [thread overview]
Message-ID: <5244795A.2000009@dancol.org> (raw)
[-- Attachment #1: Type: text/plain, Size: 8299 bytes --]
How does this change look?
=== modified file 'lisp/ielm.el'
--- lisp/ielm.el 2013-05-30 03:30:34 +0000
+++ lisp/ielm.el 2013-09-25 23:56:17 +0000
@@ -1,3 +1,4 @@
+;;; -*- lexical-binding: t -*-
;;; ielm.el --- interaction mode for Emacs Lisp
;; Copyright (C) 1994, 2001-2013 Free Software Foundation, Inc.
@@ -311,14 +312,20 @@
;;; Evaluation
-(defvar ielm-string)
-(defvar ielm-form)
-(defvar ielm-pos)
-(defvar ielm-result)
-(defvar ielm-error-type)
-(defvar ielm-output)
-(defvar ielm-wbuf)
-(defvar ielm-pmark)
+(defvar ielm-output-buffer nil
+ "List of characters to eventually output")
+
+(defvar ielm-active-process nil
+ "When ielm is evaluating a form, the comint process.")
+
+(defun ielm-standard-output-impl (char)
+ "`standard-output' while evaluating in ielm."
+ (push char ielm-output-buffer)
+ (when (eq char ?\n)
+ (comint-output-filter
+ ielm-active-process
+ (apply #'string (nreverse ielm-output-buffer)))
+ (setf ielm-output-buffer nil)))
(defun ielm-eval-input (input-string)
"Evaluate the Lisp expression INPUT-STRING, and pretty-print the result."
@@ -331,41 +338,41 @@
;; this as in output filter that converted sexps in the output
;; stream to their evaluated value. But that would have involved
;; more process coordination than I was happy to deal with.
- ;;
- ;; NOTE: all temporary variables in this function will be in scope
- ;; during the eval, and so need to have non-clashing names.
- (let ((ielm-string input-string) ; input expression, as a string
- ielm-form ; form to evaluate
- 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-wbuf ielm-working-buffer) ; current buffer after evaluation
- (ielm-pmark (ielm-pm)))
- (unless (ielm-is-whitespace-or-comment ielm-string)
+ (let ((string input-string) ; input expression, as a string
+ form ; form to evaluate
+ pos ; End posn of parse in string
+ result ; Result, or error message
+ error-type ; string, nil if no error
+ (output "") ; result to display
+ (wbuf ielm-working-buffer) ; current buffer after evaluation
+ (pmark (ielm-pm)))
+ (unless (ielm-is-whitespace-or-comment 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
+ (let ((rout (read-from-string string)))
+ (setq form (car rout)
+ pos (cdr rout)))
+ (error (setq result (error-message-string err))
+ (setq error-type "Read error")))
+ (unless 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))
+ (setq result "Working buffer has been killed"
+ error-type "IELM Error"
+ wbuf (current-buffer))
+ (if (ielm-is-whitespace-or-comment (substring string 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.
+ ;; evaluation of form.
(let ((*1 *)
(*2 **)
(*3 ***)
+ (ielm-active-process (ielm-process))
+ (ielm-output-buffer nil)
+ (standard-output #'ielm-standard-output-impl)
ielm-temp-buffer)
(set-match-data ielm-match-data)
(save-excursion
@@ -377,7 +384,7 @@
;; these default bindings are
;; identical to the ielm-local
;; bindings. Hence, during the
- ;; evaluation of ielm-form, the
+ ;; evaluation of form, the
;; ielm-local values are going to be
;; used in all buffers except for
;; other ielm buffers, which override
@@ -388,51 +395,53 @@
(** *2)
(*** *3))
(kill-buffer (current-buffer))
- (set-buffer ielm-wbuf)
- (setq ielm-result
- (eval ielm-form lexical-binding))
- (setq ielm-wbuf (current-buffer))
+ (set-buffer wbuf)
+ (setq result
+ (eval form lexical-binding))
+ (setq 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")))))
+ (error (setq result (error-message-string err))
+ (setq error-type "Eval error"))
+ (quit (setq result "Quit during evaluation")
+ (setq error-type "Eval error")))))
+ (when ielm-output-buffer
+ (ielm-standard-output-impl ?\n))
(setq ielm-match-data (match-data)))
- (setq ielm-error-type "IELM error")
- (setq ielm-result "More than one sexp in input"))))
+ (setq error-type "IELM error")
+ (setq result "More than one sexp in input"))))
;; If the eval changed the current buffer, mention it here
- (unless (eq ielm-wbuf ielm-working-buffer)
- (message "current buffer is now: %s" ielm-wbuf)
- (setq ielm-working-buffer ielm-wbuf))
+ (unless (eq wbuf ielm-working-buffer)
+ (message "current buffer is now: %s" wbuf)
+ (setq ielm-working-buffer wbuf))
- (goto-char ielm-pmark)
- (unless ielm-error-type
+ (goto-char pmark)
+ (unless error-type
(condition-case nil
;; 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
+ (setq output (concat output (pp-to-string result)))
+ (error (setq error-type "IELM Error")
+ (setq result "Error during pretty-printing (bug in pp)"))
+ (quit (setq error-type "IELM Error")
+ (setq result "Quit during pretty-printing"))))
+ (if error-type
(progn
(when ielm-noisy (ding))
- (setq ielm-output (concat ielm-output "*** " ielm-error-type " ***
"))
- (setq ielm-output (concat ielm-output ielm-result)))
+ (setq output (concat output "*** " error-type " *** "))
+ (setq output (concat output 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)))
+ (setq * result))
+ (setq output (concat output "\n")))
+ (setq output (concat output ielm-prompt-internal))
+ (comint-output-filter (ielm-process) output)))
;;; Process and marker utilities
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next reply other threads:[~2013-09-26 18:13 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-26 18:13 Daniel Colascione [this message]
2013-09-26 20:49 ` ielm changes: display standard-output in buffer Stefan Monnier
2013-09-27 3:37 ` Daniel Colascione
2013-09-28 0:46 ` Stefan Monnier
2013-10-03 6:23 ` Daniel Colascione
2013-10-03 13:50 ` Stefan Monnier
2013-10-05 1:42 ` Daniel Colascione
2013-10-05 13:45 ` Stefan Monnier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5244795A.2000009@dancol.org \
--to=dancol@dancol.org \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).