如何解决Emacs问题?


21

在Emacs表现不理想的情况下,我该怎么做才能解决问题?我可以采取哪些步骤自己找到并解决问题?

或者,如果失败,我如何收集有用的信息,以便此处的人(或在邮件列表或其他论坛上)可以帮助我解决问题?

我的Emacs包含许多程序包,从Internet上复制并粘贴(或杀死并重载)的摘要的集合,以及我自己的自定义elisp,其中一些我不记得写或不再理解。有没有办法弄清楚所有这些并发症?


不确定这是否是最佳选择,但是第一步有很多问题需要得到答案/评论emacs -Q。我将其写为将这些问题链接为新用户的常规帮助的内容。
— 泰勒

是的,这是最好的地方。实际上,大约2年前就提出了这样一个问题:meta.emacs.stackexchange.com/q/198/184谢谢!
— T. Verron,

Answers:


28

步骤1:执行 emacs -Q

您需要做的第一件事是运行emacs,而无需进行任何自定义。如果您可以在原始Emacs中重现该问题,则实际上可能是Emacs本身的错误。这种情况很少见,但我们首先将其排除在外。

如果您从命令行中使用-Q标志(即)启动Emacs,则将emacs -Q获得裸evans或“原始” emacs,并且未加载任何本地定制。您的问题仍然存在吗?如果是这样,请跳至“提供错误食谱”。

步骤1b:如果问题出在包装上怎么办?

如果您的问题是特定于某个软件包的,那么显然,如果不加载该软件包,您将无法重现该问题。但是您只想加载相关的软件包,而不是全部配置。为此,请emacs -Q再次运行,并准备以下简短脚本:

(require 'package)
(setq package-load-list
      '((package1 t)))
(package-initialize)

用package1您要加载的软件包的名称替换。如果需要加载多个软件包,请相应地修改脚本:

(require 'package)
(setq package-load-list
      '((package1 t)
        (package2 t)
        (package3 t)))
(package-initialize)

要加载此代码,可以将其粘贴到*scratch*缓冲区中,然后调用M-x eval-buffer。(或任何缓冲区,只要其中没有任何其他代码!)。

至此,您已经加载了软件包,并且仅加载了要测试的软件包。如果您现在可以重现该问题,请跳至“提供错误配方”。

步骤2:在您的装置中寻找错误 .emacs

现在,您已经确认问题出在您的配置中(“呼叫来自内部!”)。您的配置可能长达数千行,并可能加载许多不同的文件。为了找到问题,您将进行二进制搜索,一次注释掉一半的代码以缩小范围。1个

  1. 打开常规emacs emacs,无需-Q选择。
  2. 打开你的配置文件(通常~/.emacs或者.emacs.d/init.el,如果你不能找到它尝试C-h v user-init-file)
  3. 选择文件的前半部分:C-space要设置标记,请向下滚动一半以扩展区域
  4. 注释掉所选区域:M-;并保存文件
  5. 打开一个新的 emacs(您的测试emacs),使第一个emacs运行。测试emacs将读取您的配置的简化版本。
  6. 尝试在测试emacs中重现该问题
  7. 如果无法重现,请关闭测试emacs,并在原始emacs中undo使用注释C-/,然后注释掉剩余代码的一半。打开一个新的测试emacs,然后重试。
  8. 如果您可以重现该问题,请注释掉剩余代码的一半,然后查看问题是否仍然存在。
  9. 重复此过程,直到找到重现该问题所需的最小配置。

当然,如果您的问题出在特定的程序包上,则必须保留注释该程序包的代码。

如果您的配置文件加载了其他文件,您可能最终也会将搜索范围扩展到这些文件。

此时,您可能已经发现问题是由于仅一行或两行代码所致。您甚至可以自己修复它。如果是这样,那么恭喜,您已经学到了一些东西!否则,请继续执行第三步。

步骤3:提供错误食谱

在这一点上,您应该能够提供详细的错误配方以在此处发布。它应包括:

  • 您的Emacs版本(您可以通过以下方式从Emacs获得此版本: M-x emacs-version
  • 您的操作系统(Windows#,Mac,Linux发行版)
  • 苦苦挣扎的软件包版本(如果有)
  • 证明问题所必需的特定步骤,包括您期望发生的事情以及实际发生的事情。

例如,我可能会发布这样的问题:

我对超级模式有疑问。当我使用时M-x sm-compile-code,它会从我的PayPal帐户中提款。

重现步骤:

加载超级模式:

(require 'package)
(setq package-load-list
      '((super-mode t)))
(package-initialize)
  • 使用打开一个新文件 C-x C-f my-code
  • 输入一行代码:
10 goto 10
  • 呼叫 M-x sm-compile-code

我希望这可以调用超级编译器并编译我的程序。取而代之的是,我在微型缓冲区中看到一条消息:“ $ 100从Paypal转移到超级模式作者”

GNU Emacs 25.1.50.3
Debian Linux
超模式版本3.1415


1将错误猎人包可以帮助你用这个,(半)自动平分你的init文件。


也许您可以提及The Bug Hunter。
— 奥马尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.