bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#135: eval-defun binds print-level during eval


From: Lars Ingebrigtsen
Subject: bug#135: eval-defun binds print-level during eval
Date: Sun, 24 Apr 2022 17:10:26 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux)

I had an idea, after obviously pondering this issue for ten years.

To recap, for people with bad memories -- put this in a buffer and
`C-M-x' it:

(progn print-level)

It will print 4, because we rebind print-level before evaling it, but
ideally it should have its real value while doing the eval, but be
eval-expression-print-level during printing.

As the printing is actually deep inside the bowels of readevalloop,
untangling that's a challenge...  but...  the following simple change
handles the test case, and doesn't seem to lead to any obvious
regressions.

Any comments here?

diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el
index 33f6902491..c442d0fa76 100644
--- a/lisp/progmodes/elisp-mode.el
+++ b/lisp/progmodes/elisp-mode.el
@@ -1614,8 +1614,6 @@ elisp--eval-defun
   ;; printing, not while evaluating.
   (defvar elisp--eval-defun-result)
   (let ((debug-on-error eval-expression-debug-on-error)
-       (print-length eval-expression-print-length)
-       (print-level eval-expression-print-level)
         elisp--eval-defun-result)
     (save-excursion
       ;; Arrange for eval-region to "read" the (possibly) altered form.
@@ -1631,9 +1629,13 @@ elisp--eval-defun
           (setq form (funcall load-read-function (current-buffer)))
           (setq end (point)))
         ;; Alter the form if necessary.
-        (let ((form (eval-sexp-add-defvars
-                     (elisp--eval-defun-1
-                      (macroexpand form)))))
+        (let ((form `(let ((print-level ,print-level)
+                           (print-length ,print-length))
+                       ,(eval-sexp-add-defvars
+                         (elisp--eval-defun-1
+                          (macroexpand form)))))
+             (print-length eval-expression-print-length)
+             (print-level eval-expression-print-level))
           (eval-region beg end standard-output
                        (lambda (_ignore)
                          ;; Skipping to the end of the specified region


-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no






reply via email to

[Prev in Thread] Current Thread [Next in Thread]