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

Emacs: dbus-related error when trying to switch to latex mode

自从几天前我开始将 dbus 与 Emacs 一起使用(意味着我重新编译了 dbus-support),当我打开一个乳胶文件或尝试手动切换到乳胶模式时,我得到

File mode specification error: (invalid-function dbus-ignore-errors)

并且 emacs 停在那里并保持基本模式。

我将 dbus 用于 Zeitgeist-Support,它工作正常,直到重新编译,Auctex 工作得同样好。我检查了 dbus-functions 是否可用,结果:它们出现在帮助中(包括 "dbus-ignore-errors"),但它们似乎不适用于 execute-extended-commad (M-x),这意味着它们不可用显示完成,无法执行。另一方面,它们可用于 lisp-eval。

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

禁用时代精神插件不会改变这种情况。

有什么建议吗?

此致

马蒂亚斯

错误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.eldbus-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 是一个宏。