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

Debugging C-u M-x-重新编译错误:“0”;错误类型参数:consp,nil";,debugging,emacs,elisp,emacs24,Debugging,Emacs,Elisp,Emacs24,如果我在不是*编译*缓冲区的缓冲区(例如,源文件)中执行C-u M-x重新编译,我会在提示编译命令后收到此错误-“错误类型参数:consp,nil”。为什么会这样?我希望在comint工作时以交互方式运行重新编译,有时在编译缓冲区之外。如何执行此操作?此类错误通常表示您的配置存在问题。尝试调查消息缓冲区输出。这里可能有一些线索 当然,用代码从缓冲区调用重新编译命令是正常的。将它绑定到C-C-C是一种惯例。尝试使用emacs-Q,只是为了确定(是的,我知道你说你注释掉了所有的init文件,但只是为

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

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


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

尝试使用
emacs-Q
,只是为了确定(是的,我知道你说你注释掉了所有的init文件,但只是为了确定——这比注释掉所有内容容易得多)

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

接下来,引发错误并查看调试器
*Backtrace*
。它不仅会向您显示哪个函数引发了错误,因为它期望一个cons并得到了
nil
,还会显示哪个函数调用了它,传递了坏参数。等等

如有必要,您可以在堆栈(左侧)上的函数上单击
mouse-2
,查看它们的源代码。或者将光标放在它们上面,并使用
C-h f
查看它们的文档,特别是它们期望的参数和返回值

通过这种方式,很容易找到罪魁祸首的代码(很可能,不管您怎么说,这是您不知何故加载的一些非常规的Emacs Lisp代码)

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

此外,您还可以说在它提示您之后出现错误。在它提示之后,在您键入任何内容之前?在您键入命令名并点击
RET
之后?请尝试更具体一些


评论后更新:

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

传递给它的
编译参数的值似乎不好。在提示符处输入的命令名将成为
编译参数列表中的第一个。其他名称取自上次调用
compile
recompile
仅重用相同的参数(命令名除外):
(模式名函数高亮显示regexp)模式名函数高亮显示regexp)

但是,请注意,
编译参数
是缓冲区本地的。因此,如果您更改为其他缓冲区,则其值可能不是您需要的值。您需要上一次
编译
中的值,因此您应该在执行
编译
的相同缓冲区中执行
重新编译


(FWIW,我自己不再使用
(重新)编译
,因为我不再开发软件了。我只是看了一下源代码。)

刚刚注释掉了我的整个.emacs文件并手动尝试了以下所有步骤:
C-u M-x compile
,这打开了交互式编译缓冲区。然后切换回源代码缓冲区,运行
C-u M-x recompile
。迷你缓冲区提示我输入编译命令(出于某种原因)点击RET,然后出现同样的错误。运行非交互式重新编译可能是正常的,但如果我需要以交互方式运行它呢?老实说,我认为这是一个错误,我正在运行24.3.1。下面是消息缓冲区输出-(无需保存文件)交互调用:错误类型参数:consp,nilIt看起来您没有做错任何事情。没有C-u时问题仍然存在吗?您是否尝试重新启动emacs?简单的M-x重新编译没有错误,但我使用的工具提供了一个输入提示终端。如果我没有在交互模式下运行编译缓冲区是只读的,我无法在工具终端中输入命令。我尝试过用同样的结果重新启动emacs btw。我遇到的实际问题是,如果我从编译缓冲区中重新编译M-x,编译缓冲区将从交互式只读变为非交互式只读。我认为这是一个bug?看起来肯定是个bug。Just it add-这就像将编译缓冲区从comint模式中踢出一样,我真的认为这是不应该发生的。编辑:刚刚看到你的帖子!谢谢你的帮助,我非常感谢!我在scratch缓冲区中完成了emacs-Q和
C-UMX编译
C-UMX重新编译
(甚至不需要做任何事情来产生这个问题)。下面是调试器输入的输出--Lisp错误:(错误类型参数consp nil)重新编译((4))交互调用(重新编译记录nil)命令执行(重新编译记录)执行扩展命令((4)“重新编译”)交互调用(执行扩展命令nil nil)
。我真正想要的是,在我重新编译后,编译缓冲区停止从comint模式切换到只读非交互模式,如果这更清晰的话。他们也非常感谢您解释所有这些命令。我真的不知道如何调试emacs lisp并进行回溯。这真的很有用!有一长串瘦命令gs我不知道emacs,所以当我学到像这样有用的东西时,我真的很感激。emacs版本是2014-01-03的24.3.1。也是在我输入命令名并点击
RET
后发生的。有两个