C-u M-x - 重新编译错误:“错误的类型参数:consp,nil”

时间:2014-05-09 03:34:37

标签: debugging emacs elisp emacs24

如果我在不是C-u M-x recompile缓冲区的缓冲区(例如源文件)中进行*compilation*,我会收到此错误 - “错误的类型参数:consp,nil”在提示之后用于编译命令。为什么是这样?我希望以comint工作方式交互式重新编译,有时在编译缓冲区之外。我该怎么做?

2 个答案:

答案 0 :(得分:3)

尝试使用emacs -Q,只是为了确定(是的,我知道你说你已经注释掉了所有的init文件,但只是为了确定 - 并且比评论更容易做到 - 一切)。

接下来,将debug-on-error设置为t - 如果您愿意,可以M-x toggle-debug-on-error执行此操作。

接下来,引发错误并查看调试器*Backtrace*。它不仅会告诉你哪个函数引发了错误,因为它期望一个缺点而是得到nil,而且还有什么函数调用它,传递坏参数。等等堆栈。

如有必要,您可以单击堆栈上的mouse-2功能(在左侧,查看其源代码。或者将光标放在它们上并使用C-h f查看其文档 - 特别是,他们期望什么参数以及他们的回报值应该是什么。

通过这种方式,很容易找到导致罪魁祸首的代码。 (最有可能的是,尽管你说的是,但是你以某种方式加载了一些非香草的Emacs Lisp代码。)

另外,请说明您的emacs版本:M-x emacs-version。如果您使用的是开发快照,那么问题可能来自vanilla代码(即emacs -Q);否则,那不太可能。

另外,你说你在提示你后会收到错误。提示之后,在您输入任何内容之前立即?键入命令名称并单击RET后?尝试更具体。


评论后更新:

加载库compile.el(不是.elc)。然后执行M-x debug-on-entry recompile,然后在输入函数d时使用recompile逐步调试调试器。您感兴趣的是调用compilation-start时(应用于其args)。

似乎传递给它的compilation-arguments的值并不好。您在提示符处输入的命令名称将成为compilation-arguments列表中的第一个。其他内容取自上次调用时compilerecompile只重用相同的参数(命令名除外):(mode name-function highlight-regexp)mode name-function highlight-regexp)

但是,请注意compilation-arguments是缓冲区本地的。因此,如果您更改为其他缓冲区,则其值可能不是您需要的值。您需要上一个compile的值,因此您应该在recompile所在的同一缓冲区中执行compile

(FWIW,我不会自己使用(re)compile因为我不再开发软件。我只是看了一下源代码。)

答案 1 :(得分:0)

此类错误通常表示您的配置存在问题。尝试调查消息缓冲区输出。那里可以有一些线索。

当然,使用您的代码从缓冲区调用重新编译命令是正常的。将其与C-c C-c绑定是一种惯例。