通常调试的最简单方法是使用printf
。我该如何调试emacs-lisp代码?如何从elisp向emacs编辑器打印一些内容?或者是否有任何方法来调试elisp代码?
例如,我该如何检查以下代码是否在.emacs
文件中运行?
(load "auctex.el" nil t t)
调试器(edebug)的使用非常简单。进入函数的定义并键入M-x edebug-defun。下一次调用该函数时,您将能够像使用其他调试器一样逐步执行代码。键入?以获取键绑定列表或查看edebug的文档。
SPC
用于进行下一步,i
用于单步进入,o
用于单步跳出,q
用于退出。 - kotchwaneGNU Emacs中有两个调试器:
我使用debug
。以下是常见的入口点(使用调试器的方法):
使用M-x debug-on-entry
,然后输入您想要进入调试器的函数。
使用M-x toggle-debug-on-error
--
当出现错误时进入调试器。
M-x toggle-debug-on-quit
--
当用户按下C-g时进入调试器。debug
,以在这些位置进入调试器:(debug)
您可以使用d来单步调试,或者使用c跳过特定评估的细节。
RET
,或按 e
并评估您感兴趣的变量。 - danleidebug
提供要评估的sexp,以便在调试器打开时显示其值。例如:(debug nil (current-buffer))
。 - Drewc
的作用。我称之为“跳过细节”。c
代表“继续”,大概是这个意思。它会完全评估给定的步骤,而不需要让你通过每个中间步骤来完成它。 - Drew这对于打印数值很有用
(message "Hello (%s)" foo)
但对于数据结构并不是很有效。对于这种情况,使用
(prin1 list-foo)
或者使用 (prin1-to-string) 将其嵌入到 (message) 中。
最简单的调试方式可能是交互式运行您的代码。您可以在Lisp缓冲区中通过将光标放在表达式后并运行C-x C-e (eval-last-sexp
)来实现。
或者:
(message "hello world")
使用C-h f message命令可以了解有关内置消息函数的更多信息。如果您生成了大量消息,则可能需要将变量message-log-max
自定义为较大的值。
printf
方法,有时候也是一个非常好的方法。 - Drew