Emacs:尝试切换到latex模式时出现dbus相关错误

Emacs:尝试切换到latex模式时出现dbus相关错误,emacs,dbus,auctex,Emacs,Dbus,Auctex,由于我几天前开始在Emacs中使用dbus(这意味着我使用dbus支持重新编译),当我打开一个latex文件或尝试手动切换到latex模式时,我会 File mode specification error: (invalid-function dbus-ignore-errors) emacs停止在那里,保持基本模式 我使用dbus作为时代精神的支持,它工作得很好,直到重新编译,Auctex工作得同样好。我检查了dbus函数是否可用,结果是:它们显示在帮助中(包括“dbus忽略错误”),但它

由于我几天前开始在Emacs中使用dbus(这意味着我使用dbus支持重新编译),当我打开一个latex文件或尝试手动切换到latex模式时,我会

File mode specification error: (invalid-function dbus-ignore-errors)
emacs停止在那里,保持基本模式

我使用dbus作为时代精神的支持,它工作得很好,直到重新编译,Auctex工作得同样好。我检查了dbus函数是否可用,结果是:它们显示在帮助中(包括“dbus忽略错误”),但它们似乎不可用于执行扩展commad(M-x),这意味着它们不会在完成时显示,并且无法执行。另一方面,它们可用于lisp评估

我不知道这是否是这些函数的正常行为,但无论如何,auctex的函数可用性似乎存在某种问题

禁用zeitgeist插件不会改变这种情况

有什么建议吗

致意


Matthias

错误
无效函数
通常意味着在定义某个宏之前编译了一段Emacs Lisp代码,现在正试图将该宏作为函数调用。要解决此问题,请找到有问题的模块,并在确保定义了宏(
dbus ignore errors,在本例中为
)后重新编译它


对于Auctex,发生这种情况是因为
tex.el
包含以下内容:

;; Require dbus at compile time to prevent errors due to `dbus-ignore-errors'
;; not being defined.
(eval-when-compile (and (featurep 'dbusbind)
            (require 'dbus nil :no-error)))
也就是说,它尝试加载dbus库,但忽略失败。如果编译Auctex的Emacs不支持dbus,
dbus ignore errors
将因此在编译
tex.el
时编译为函数调用。这没有问题,因为
dbus ignore errors
调用受
featurep
测试的保护

如果这个字节编译过的文件随后被加载到一个支持dbus的Emacs实例中,我们会突然到达有问题的那一行,并尝试将宏作为一个函数调用,但由于
函数无效而失败。这就是为什么在加载到支持dbus的Emacs之前需要重新编译文件的原因

解决此问题的一种方法是将
dbus ignore errors
行包装到
eval
中,更改此行:

     (dbus-ignore-errors (dbus-get-unique-name :session))
为此:

     (eval '(dbus-ignore-errors (dbus-get-unique-name :session)))

这会将如何计算该表达式的决定推迟到运行时,此时Emacs将知道
dbus ignore errors
是一个宏。

键入
M-x切换debug on error
,重现问题,然后发布stacktrace,这样可能有人会有更好的机会帮忙。也许您可以提供一个示例,说明您是如何遇到这种情况的,从
emacs-Q
开始。错误似乎发生在字节编译的emacs Lisp文件中,该文件是在不知道
dbus ignore errors
是宏的情况下编译的。找到使用stacktrace的文件,并在加载
dbus
模块后重新编译。@legoscia-是!你说对了!我只需要重新安装auctex。对不起,我没想到。它是字节编译的,不知道dbus支持。请将您的评论作为答案发布,以便我可以接受。就我而言,这是auctex软件包中的内容,因此重新安装软件包就足够了。谢谢