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

5
自从几天前我开始使用带有DBus的Emacs(意味着我重新编译了带有DBus支持的Emacs)后,当我打开一个latex文件或尝试手动切换到latex模式时,就会出现以下情况:
File mode specification error: (invalid-function dbus-ignore-errors)

同时,emacs停留在基本模式。我的Zeitgeist-Support使用dbus,这个工作正常,即使重新编译后Auctex也能正常工作。我检查了dbus函数是否可用,结果是:它们在帮助文件中显示出来(包括“dbus-ignore-errors”),但似乎无法在execute-extended-commad(M-x)中使用,这意味着它们不会在自动完成中显示,并且不能被执行。另一方面,它们对于lisp-eval是可用的。

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

禁用zeitgeist插件后情况没有改变。

有什么建议吗?

最好的祝福

马蒂亚斯


输入“M-x toggle-debug-on-error”,重现问题,然后发布堆栈跟踪,以便其他人更好地帮助。 - juanleon
也许您可以提供一个示例,说明您如何遇到这个问题,从 emacs -Q 开始。 - Michael Albinus
看起来错误发生在一个字节编译的Emacs Lisp文件中,该文件在不知道dbus-ignore-errors是宏的情况下进行了编译。使用堆栈跟踪找到该文件,并在加载dbus模块后重新编译它。 - legoscia
@legoscia - 是的!你说对了!我只需要重新安装auctex。很抱歉我没有想到这一点。它被字节编译,不知道dbus支持。请将您的评论发布为答案,以便我可以接受它。 - mat
1个回答

5
错误 invalid-function 通常意味着某段 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,则在编译tex.el时将编译dbus-ignore-errors成函数调用。这没问题,因为dbus-ignore-errors调用受到featurep测试的保护。
如果将这个字节编译文件加载到支持dbus的Emacs实例中,我们突然到达了有问题的行,并尝试将宏作为函数调用,这会导致invalid-function错误。这就是为什么在将文件加载到支持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是一个宏时。

1
在我的情况下,是auctex包中的某些问题,因此重新安装该包就足够了。谢谢! - mat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接