ChatGPT解决这个技术问题 Extra ChatGPT

如何调试 elisp?

通常最简单的调试方法是使用 printf。我可以做些什么来调试 emacs-lisp?如何从 elisp 向 emacs 编辑器打印内容?或者有什么方法可以调试 elisp 代码?

例如,如何检查以下代码是否在 .emacs 文件中运行?

(load "auctex.el" nil t t)
manual可能对您有所帮助。
请允许我在 Edebug 上推荐 this blog post

T
Trey Jackson

调试器 (edebug) 使用起来非常简单。转到函数的定义,然后键入 Mx edebug-defun。下次调用它时,您将能够像使用其他所有调试器一样单步执行代码。键入 ? 以获取键绑定列表,或查看 edebug 的文档。


值得注意的是调试时最重要的键绑定:SPC 进行下一步,i 进入,o 退出,q 退出。
D
Drew

GNU Emacs 中有两个调试器:

edebug - 在这里的另一篇文章中解释

调试

我使用 debug。这些是常见的入口点(使用方法):

Mx debug-on-entry 后跟要使用调试器输入的函数。

Mx toggle-debug-on-error -- 出现错误时进入调试器。

Mx toggle-debug-on-quit -- 当用户点击 Cg 时进入调试器。

在代码中的特定位置(断点)对函数调试进行显式调用,以在这些位置输入调试器:

(debug)

使用 d 或 c 单步调试调试器以跳过特定评估的详细信息。


如何检查不同变量的值?我能够通过函数进行调试,但不知道如何检查不同变量的值。
@Alok:您可以将光标放在变量上并按 RET,或按 e 并评估您感兴趣的变量。
您可以在原始(调用)上下文中评估任何性。您还可以提供一个 sexp 来评估函数 debug,以便在打开调试器时向您显示值。例如,(debug nil (current-buffer))
@nate, Elisp docs 列出可用命令。特别是,请参阅 jue 键绑定。如果 debug 不够,Edebug 似乎提供了更细粒度的控制流量的可能性。
@nate:这就是 c 所做的。我称之为“跳过细节”。 c 大概代表“继续”。它完全评估给定的步骤,而不需要您逐步完成每个中间步骤来完成它。
j
jplindstrom

这对于打印值很有用

(message "Hello (%s)" foo)

但不适用于数据结构。为此,使用

(prin1 list-foo)

或 (prin1-to-string) 将其嵌入到 (message) 中。


您可以使用“%S”打印具有格式的数据结构
T
Trey Jackson

最简单的调试方法可能是以交互方式运行您的代码。您可以在 lisp 缓冲区中执行此操作,方法是将您的点放在表达式之后并运行 Cx Ce (eval-last-sexp)。

或者:

(message "hello world")

Ch f message 以了解有关内置消息功能的更多信息。如果您生成大量消息,您可能希望将变量 message-log-max 自定义为更大的值。


这相当于 printf 方法,有时它是一种非常好的方法。
o
offby1

一一回答您的问题:

打印一些东西:有一百万种方法。 (message "Hello") 将字符串放入回显区域; (insert "hello") 将字符串放入当前缓冲区的点...

我如何检查以下代码是否运行:我只需将“auctex.el”替换为(比如说)“frotzumotzulous”(即,任何字符串,只要它没有命名真实文件)然后看看你是否收到错误消息。如果您没有收到错误,那么显然该代码没有运行。