19.2.10 求值列表缓冲区

你可以使用名为 *edebug* 的**求值列表缓冲区 交互式求值表达式(evaluation list buffer)。 你还可以设置一组 求值列表(evaluation list),让这些表达式在 Edebug 每次刷新显示时自动求值。

E

切换到求值列表缓冲区 *edebug*edebug-visit-eval-list)。

*edebug* 缓冲区中,你可以使用 Lisp Interaction 模式的命令(see Lisp Interaction in The GNU Emacs Manual)以及以下专用命令:

C-j

在外部上下文中求值光标前的表达式,并将值插入缓冲区(edebug-eval-print-last-sexp)。 使用前缀参数 0(C-u 0 C-j)时,不截断长内容(如字符串和列表)。

C-x C-e

在 Edebug 外部的上下文中求值光标前的表达式(edebug-eval-last-sexp)。

C-c C-u

根据缓冲区内容重建新的求值列表(edebug-update-eval-list)。

C-c D

删除光标所在的求值列表组(edebug-delete-eval-item)。

C-c C-w

切回源码缓冲区并定位到当前暂停点(edebug-where)。

你可以在求值列表窗口中用 C-jC-x C-e 求值表达式,就像在 *scratch* 中一样; 但它们是在 Edebug 外部的上下文中求值的。

你交互式输入的表达式(及其结果)会在继续执行时丢失; 但你可以设置一个 求值列表(evaluation list),让其中的表达式在每次执行暂停时都被求值。

要实现这一点,请在求值列表缓冲区中写入一个或多个 求值列表组(evaluation list groups)。 一个求值列表组由一个或多个 Lisp 表达式组成,组与组之间用注释行分隔。

命令 C-c C-uedebug-update-eval-list)会重建求值列表,扫描缓冲区并使用每个组的第一个表达式。 (设计思路是:组内第二个表达式是之前计算并显示的结果。)

每次进入 Edebug 时,都会重新显示求值列表:将每个表达式插入缓冲区,后面跟上其当前值。 它还会插入注释行,使每个表达式自成一组。 因此,如果你在不修改缓冲区内容的情况下再次输入 C-c C-u,求值列表实际上不会改变。

如果从求值列表中求值时发生错误,错误信息会以字符串形式显示,就像它是结果一样。 因此,使用当前无效变量的表达式不会中断你的调试过程。

下面是求值列表窗口在添加多个表达式后的示例:

(current-buffer)
#<buffer *scratch*>
;---------------------------------------------------------------
(selected-window)
#<window 16 on *scratch*>
;---------------------------------------------------------------
(point)
196
;---------------------------------------------------------------
bad-var
"Symbol's value as variable is void: bad-var"
;---------------------------------------------------------------
(recursion-depth)
0
;---------------------------------------------------------------
this-command
eval-last-sexp
;---------------------------------------------------------------

要删除一个组,将光标移入其中并输入 C-c C-d, 或者直接删除该组的文本,再用 C-c C-u 更新求值列表。 要向求值列表添加新表达式,将表达式插入合适位置,新建一行注释,然后输入 C-c C-u。 你不必在注释行中输入横线——其内容无关紧要。

选中 *edebug* 后,你可以用 C-c C-w 返回源码缓冲区。 *edebug* 缓冲区会在你继续执行时被关闭,并在下次需要时重新创建。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike