如果我在不是C-u M-x recompile
缓冲区的缓冲区(例如源文件)中进行*compilation*
,我会收到此错误 - “错误的类型参数:consp,nil”在提示之后用于编译命令。为什么是这样?我希望以comint工作方式交互式重新编译,有时在编译缓冲区之外。我该怎么做?
答案 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
列表中的第一个。其他内容取自上次调用时compile
:recompile
只重用相同的参数(命令名除外):(mode name-function highlight-regexp)mode name-function highlight-regexp)
。
但是,请注意compilation-arguments
是缓冲区本地的。因此,如果您更改为其他缓冲区,则其值可能不是您需要的值。您需要上一个compile
的值,因此您应该在recompile
所在的同一缓冲区中执行compile
。
(FWIW,我不会自己使用(re)compile
因为我不再开发软件。我只是看了一下源代码。)
答案 1 :(得分:0)
此类错误通常表示您的配置存在问题。尝试调查消息缓冲区输出。那里可以有一些线索。
当然,使用您的代码从缓冲区调用重新编译命令是正常的。将其与C-c C-c绑定是一种惯例。