【问题标题】:C-u M-x - recompile error: "Wrong type argument: consp, nil"C-u M-x - 重新编译错误:“错误类型参数:consp,nil”
【发布时间】:2014-05-09 03:34:37
【问题描述】:

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

【问题讨论】:

    标签: debugging emacs elisp emacs24


    【解决方案1】:

    尝试使用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 列表中的第一个。其他的取自您上次调用时的compilerecompile 只是重复使用相同的参数(命令名称除外):(mode name-function highlight-regexp)mode name-function highlight-regexp)

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

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

    【讨论】:

    • 我在暂存缓冲区中做了 emacs -Q 和 C-u M-x compileC-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 模式切换到只读非交互模式,如果更清楚的话
    • 嘿,也非常感谢您解释所有这些命令。我真的不知道如何调试 emacs lisp 并进行回溯。这真的很有用!有一长串我不知道的关于 emacs 的事情,所以当我学到像这样有用的东西时,我真的很感激。 Emacs 版本是 2014-01-03 的 24.3.1。也是在我输入命令名称并点击RET 之后才发生这种情况。
    • 堆栈中列出了两个可点击的函数(鼠标 2)。 Recompileexecute-extended-command。两者都分别说找不到库/(path-to-file/compile.el/(path-to-file)/simple.el。不开玩笑。
    • 嗯。试试M-x find-library compile.el。或执行C-h f recompile,然后单击文件名compile.el。这些都会带你到源文件。
    【解决方案2】:

    此类错误通常说明您的配置存在问题。尝试调查 messages 缓冲区输出。那里可能有一些线索。

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

    【讨论】:

    • 刚刚注释掉了我的整个 .emacs 文件并手动尝试了所有步骤,如下所示:C-u M-x compile,这打开了交互式编译缓冲区。然后切换回源代码缓冲区,运行C-u M-x recompile。 Mini-buffer提示我输入编译命令(出于某种原因)点击RET,然后同样的错误。运行非交互式重新编译可能是正常的,但是如果我需要交互式运行它怎么办?老实说,我认为这是一个错误,我正在运行 24.3.1。这是消息缓冲区输出 - (无需保存文件)交互式调用:错误的类型参数:consp,nil
    • 看起来你没有做错什么。没有 C-u 问题仍然存在吗?您是否尝试过重新启动 emacs?
    • 我使用纯 M-x 重新编译没有错误,但是我正在使用的工具提供了一个输入提示终端。如果我不在交互模式下运行,编译缓冲区是只读的,我无法在工具终端中输入命令。我尝试以相同的结果重新启动 emacs。我遇到的实际问题是,如果我从 compilation 缓冲区中重新编译 Mx,编译缓冲区会从交互式变为非交互式只读。我认为这是一个错误?
    • 当然看起来像一个错误。
    • 只需添加 - 就像将 compilation 缓冲区从 comint 模式中踢出,我真的认为这不应该发生。编辑:刚看到你的帖子!感谢您的帮助,我非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2020-04-14
    • 2013-06-22
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 2021-09-09
    • 2021-09-21
    • 1970-01-01
    相关资源
    最近更新 更多