如何解决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.