]> git.eshelyaron.com Git - emacs.git/commitdiff
Extend 'e' in edebug to pretty-print the values
authorLars Ingebrigtsen <larsi@gnus.org>
Fri, 17 Jun 2022 22:17:40 +0000 (00:17 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Fri, 17 Jun 2022 22:17:40 +0000 (00:17 +0200)
* doc/lispref/edebug.texi (Edebug Eval): Document it.

* lisp/emacs-lisp/edebug.el (edebug-eval-expression): Allow
displaying the full value in a different buffer.

doc/lispref/edebug.texi
etc/NEWS
lisp/emacs-lisp/edebug.el

index 0fc5271d5addb767e84f5cc21341d3b5a05938eb..377cd21da8625dc68813ad9fd97da6fe8e6fea9d 100644 (file)
@@ -701,7 +701,11 @@ on this process.
 @item e @var{exp} @key{RET}
 Evaluate expression @var{exp} in the context outside of Edebug
 (@code{edebug-eval-expression}).  That is, Edebug tries to minimize
-its interference with the evaluation.  By default, this command
+its interference with the evaluation.  The result is shown in the echo
+area, or, if this command is given a prefix, pop up a new buffer and
+pretty-print the result there.
+
+By default, this command
 suppresses the debugger during evaluation, so that an error in the
 evaluated expression won't add a new error on top of the existing one.
 Set the @code{debug-allow-recursive-debug} user option to a
index b9a226173534a83fea2c51701b6742c8bfe90d77..d18af0502d2fbebdc8438358fe8a44bc545a7f46 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1019,6 +1019,9 @@ buffer or while edebugging) and 'C-x C-e' (while edebugging) commands
 lead to a (further) backtrace.  By default, this variable is nil,
 which is a change in behaviour from previous Emacs versions.
 
++++
+*** 'e' in edebug can now take a prefix to pretty-print the results.
+
 ** Compile
 
 +++
index 9dc5a1315e52f0c728f30442a5b3315b16994948..58cfd47abdf512764e85314bb313b49a69a5c2d0 100644 (file)
@@ -3707,30 +3707,44 @@ Return the result of the last expression."
 (defalias 'edebug-format #'format-message)
 (defalias 'edebug-message #'message)
 
-(defun edebug-eval-expression (expr)
+(defun edebug-eval-expression (expr &optional pp)
   "Evaluate an expression in the outside environment.
 If interactive, prompt for the expression.
-Print result in minibuffer."
-  (interactive (list (read--expression "Eval: ")))
+
+Print result in minibuffer by default, but if PP is non-nil open
+a new window and pretty-print the result there.  (Interactively,
+this is the prefix key.)"
+  (interactive (list (read--expression "Edebug eval: ")
+                     current-prefix-arg))
   (let* ((errored nil)
-         (result
+         (value
           (edebug-outside-excursion
-           (let ((result (if debug-allow-recursive-debug
-                             (edebug-eval expr)
-                           (condition-case err
-                               (edebug-eval expr)
-                             (error
-                              (setq errored
-                                    (format "%s: %s"
-                                           (get (car err) 'error-message)
-                                           (car (cdr err)))))))))
-             (unless errored
-               (values--store-value result)
-               (concat (edebug-safe-prin1-to-string result)
-                       (eval-expression-print-format result)))))))
-    (if errored
-        (message "Error: %s" errored)
-      (princ result))))
+           (if debug-allow-recursive-debug
+               (edebug-eval expr)
+             (condition-case err
+                 (edebug-eval expr)
+               (error
+                (setq errored
+                      (format "%s: %s"
+                             (get (car err) 'error-message)
+                             (car (cdr err)))))))))
+         (result
+          (unless errored
+            (values--store-value value)
+            (concat (edebug-safe-prin1-to-string value)
+                    (eval-expression-print-format value)))))
+    (cond
+     (errored
+      (message "Error: %s" errored))
+     (pp
+      (save-selected-window
+        (pop-to-buffer "*Edebug Results*")
+        (erase-buffer)
+        (pp value (current-buffer))
+        (goto-char (point-min))
+        (lisp-data-mode)))
+     (t
+      (princ result)))))
 
 (defun edebug-eval-last-sexp (&optional no-truncate)
   "Evaluate sexp before point in the outside environment.