【发布时间】:2014-05-09 03:34:37
【问题描述】:
如果我在不是*compilation* 缓冲区的缓冲区内执行C-u M-x recompile(例如,源文件),我会收到此错误 - “错误类型参数:consp,nil”在提示输入编译命令后.为什么是这样?我想在 comint 工作时以交互方式运行重新编译,有时在编译缓冲区之外。我该怎么做?
【问题讨论】:
标签: debugging emacs elisp emacs24
如果我在不是*compilation* 缓冲区的缓冲区内执行C-u M-x recompile(例如,源文件),我会收到此错误 - “错误类型参数:consp,nil”在提示输入编译命令后.为什么是这样?我想在 comint 工作时以交互方式运行重新编译,有时在编译缓冲区之外。我该怎么做?
【问题讨论】:
标签: debugging emacs elisp emacs24
尝试使用emacs -Q,只是为了确定(是的,我知道你说你注释掉了你所有的初始化文件,但只是为了确定——这比注释掉所有东西要容易得多)。
接下来,将 debug-on-error 设置为 t -- 如果您愿意,可以使用 M-x toggle-debug-on-error 来执行此操作。
接下来,引发错误,查看调试器*Backtrace*。它不仅会显示哪个函数引发了错误,因为它期望一个缺点并得到nil,而且还会显示哪个函数调用它,传递了错误的参数。以此类推。
如有必要,您可以在堆栈上的函数上单击mouse-2(在左侧,查看它们的源代码。或者将光标放在它们上并使用C-h f 查看它们的文档——特别是哪些参数他们期望以及他们的返回值应该是什么。
通过这种方式,很容易找到罪魁祸首的代码。 (很可能,不管你说什么,它是一些你以某种方式加载的非普通 Emacs Lisp 代码。)
另外,请说明您的 emacs 版本:M-x emacs-version。如果您使用的是开发快照,那么问题可能来自原版代码(即emacs -Q);否则,可能性不大。
另外,你说你在它提示你之后得到了错误。在它提示之后,在您输入任何内容之前?输入命令名称并点击RET 后?尝试更具体。
评论后更新:
加载库compile.el(不是.elc)。然后执行M-x debug-on-entry recompile,然后在输入函数recompile 时使用d 单步调试调试器。您感兴趣的是何时调用compilation-start(应用于其参数)。
看来compilation-arguments 的值传递给它是不行的。您在提示符处输入的命令名称将成为compilation-arguments 列表中的第一个。其他的取自您上次调用时的compile:recompile 只是重复使用相同的参数(命令名称除外):(mode name-function highlight-regexp)mode name-function highlight-regexp)。
但是,请注意 compilation-arguments 是缓冲区本地的。因此,如果您更改为不同的缓冲区,那么它的值可能不是您所需要的。您需要上一个compile 中的值,因此您应该在与compile 相同的缓冲区中执行recompile。
(FWIW,我自己不使用(re)compile,因为我不再开发软件了。我只是看了一下源代码。)
【讨论】:
C-u M-x compile 和 C-u M-x recompile(甚至不需要做任何花哨的事情来产生这个问题)。这是输出Debugger entered--Lisp error: (wrong-type-argument consp nil) recompile((4)) call-interactively(recompile record nil) command-execute(recompile record) execute-extended-command((4) "recompile") call-interactively(execute-extended-command nil nil)。我真正想要的是编译缓冲区在我重新编译后停止从 comint 模式切换到只读非交互模式,如果更清楚的话
RET 之后才发生这种情况。
Recompile 和 execute-extended-command。两者都分别说找不到库/(path-to-file/compile.el 和/(path-to-file)/simple.el。不开玩笑。
M-x find-library compile.el。或执行C-h f recompile,然后单击文件名compile.el。这些都会带你到源文件。
此类错误通常说明您的配置存在问题。尝试调查 messages 缓冲区输出。那里可能有一些线索。
当然,使用您的代码从缓冲区调用重新编译命令是正常的。将其绑定到 C-c C-c 是一个约定。
【讨论】:
C-u M-x compile,这打开了交互式编译缓冲区。然后切换回源代码缓冲区,运行C-u M-x recompile。 Mini-buffer提示我输入编译命令(出于某种原因)点击RET,然后同样的错误。运行非交互式重新编译可能是正常的,但是如果我需要交互式运行它怎么办?老实说,我认为这是一个错误,我正在运行 24.3.1。这是消息缓冲区输出 - (无需保存文件)交互式调用:错误的类型参数:consp,nil