你可以使用名为 *edebug* 的**求值列表缓冲区 交互式求值表达式(evaluation list buffer)。 你还可以设置一组 求值列表(evaluation list),让这些表达式在 Edebug 每次刷新显示时自动求值。
切换到求值列表缓冲区 *edebug*(edebug-visit-eval-list)。
在 *edebug* 缓冲区中,你可以使用 Lisp Interaction 模式的命令(see Lisp Interaction in The GNU Emacs Manual)以及以下专用命令:
在外部上下文中求值光标前的表达式,并将值插入缓冲区(edebug-eval-print-last-sexp)。
使用前缀参数 0(C-u 0 C-j)时,不截断长内容(如字符串和列表)。
在 Edebug 外部的上下文中求值光标前的表达式(edebug-eval-last-sexp)。
根据缓冲区内容重建新的求值列表(edebug-update-eval-list)。
删除光标所在的求值列表组(edebug-delete-eval-item)。
切回源码缓冲区并定位到当前暂停点(edebug-where)。
你可以在求值列表窗口中用 C-j 或 C-x C-e 求值表达式,就像在 *scratch* 中一样; 但它们是在 Edebug 外部的上下文中求值的。
你交互式输入的表达式(及其结果)会在继续执行时丢失; 但你可以设置一个 求值列表(evaluation list),让其中的表达式在每次执行暂停时都被求值。
要实现这一点,请在求值列表缓冲区中写入一个或多个 求值列表组(evaluation list groups)。 一个求值列表组由一个或多个 Lisp 表达式组成,组与组之间用注释行分隔。
命令 C-c C-u(edebug-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* 缓冲区会在你继续执行时被关闭,并在下次需要时重新创建。