如何在".emacs"或"init.el"中找到错误?

Kei*_*awa 16 debugging emacs elisp config initialization

有时当我打开Emacs时,Emacs初始化失败.
那是因为.emacsinit.el文件有bug.(我的错误通常来自于错误输入.)

我想在.emacs或找到bug init.el.有没有办法做到这一点?

Dre*_*rew 20

要找出你的init文件(~/.emacs)的哪一部分导致你看到的行为,递归地将你的init文件平分:首先注释掉一半,看看哪一半负责,然后是3/4,看看哪个季度负责. ..

要注释掉一个文本区域(例如,您选择的连续行),我建议comment-region(我绑定C-x C-;).使用数字前缀arg,它使用了许多;注释字符.使用普通前缀arg(C-u),它取消注释区域而不是注释它.

您也可以使用命令行开关启动Emacs --debug-init.这将导致在Emacs启动期间引发错误时打开调试器,包括在加载init文件时.调试器回溯告诉您哪个评估引发了错误(调用了哪个函数),它会显示哪个函数调用了引发错误的函数,哪个函数调用了该函数,依此类推.

当您知道哪个函数是问题时,如果需要,您可以通过(debug-on-entry 'THE-FUNCTION)接近init文件的开头来调试其评估.这将在输入函数时打开调试器,而不是仅显示引发错误时发生的情况.然后,您可以使用d(或c跳过一个步骤)逐步调试调试器,以查看出错的地方.

如果您希望从某个断点开始逐步执​​行该函数,则将定义函数的源代码复制到init文件,然后插入(debug)要打开调试器的位置.

与往常一样,Emacs手册是您的朋友.例如,请参阅ChecklistEmacs手册中的节点Invoking the Debugger和Elisp手册中的节点.

还有另一个调用程序edebug,也称为手册中的文档.有些人更喜欢它debug.(我更喜欢debug.)两者都很好.

如果您已经加载了Emacs Lisp源文件而不是它们的字节编译版本,那么使用调试器通常会提供更多信息.如果您使用调试器开始调查特定问题,则可能需要先加载有问题的*.el(非*.elc)文件.

  • 请参阅[**this help-gnu-emacs thread**](http://lists.gnu.org/archive/html/help-gnu-emacs/2014-04/msg00602.html),了解为什么`comment-region`优于"comment-dwim"用于评论和解除代码块.简而言之:`comment-dwim`是多用途的; 它并不专注于区域评论,而是试图做一些事情.不,如果它有注释行和未注释的行,`comment-dwim`将不会取消注释该区域. (2认同)

bio*_*man 10

我在elisp bug hunter https://github.com/Malabarba/elisp-bug-hunter上取得了巨大的成功.

最常见的问题是无法匹配的括号,加载失败的包:

自动错误搜索

如果您的Emacs init文件在启动期间发出错误信号,但您不知道原因,则只需发出

M-x bug-hunter-init-file RET e

而Bug Hunter会为你找到它.请注意,您的init.el(或.emacs)必须是幂等的才能工作.

互动狩猎

如果Emacs启动时没有错误但是某些内容无法正常工作,请调用相同的命令,但选择交互选项:

M-x bug-hunter-init-file RET i

Bug Hunter将多次启动一个单独的Emacs实例,然后每次都会询问您该实例是否存在问题.这样做大约5-12次后,你会得到结果.


son*_*yao 8

您可以.emacs像这样调试文件:调试自定义文件

使用'-debug-init'命令行选项启动Emacs.这样可以在评估.emacs文件之前启用Emacs Lisp调试器,并在出现问题时将其置于调试器中.回溯缓冲区中的顶行将是错误消息,该缓冲区的第二行或第三行将显示导致问题的.emacs文件中的Lisp代码.

您还可以通过将光标移动到函数或参数的末尾并键入C-x C-e(M-x eval-last-sexp)来评估.emacs文件中函数的单个函数或参数.

使用C-h v(M-x describe-variable)检查您尝试设置或使用的变量的值.