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

Posted

技术标签:

【中文标题】Emacs:尝试切换到乳胶模式时出现与 dbus 相关的错误【英文标题】:Emacs: dbus-related error when trying to switch to latex mode 【发布时间】:2015-06-05 23:12:47 【问题描述】:

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

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

并且 emacs 在基本模式下停止。

我将 dbus 用于 Zeitgeist-Support,它运行良好,直到重新编译为止,Auctex 也同样运行良好。我检查了 dbus 函数是否可用,结果:它们出现在帮助中(包括“dbus-ignore-errors”),但它们似乎不适用于执行扩展命令(Mx),这意味着它们没有'不显示在完成中并且不能被执行。另一方面,它们可用于 lisp-eval。

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

禁用 zeitgeist-plugin 不会改变这种情况。

有什么建议吗?

最好的问候

马蒂亚斯

【问题讨论】:

输入M-x toggle-debug-on-error,重现问题,然后发布堆栈跟踪,以便有人有更好的机会提供帮助 也许你提供一个例子,你是如何遇到这个的,从emacs -Q开始。 似乎错误发生在字节编译的 Emacs Lisp 文件中,该文件是在不知道 dbus-ignore-errors 是宏的情况下编译的。使用堆栈跟踪查找该文件正在使用的文件,并在加载 dbus 模块后重新编译它。 @legoscia - 是的!你说对了!我只需要重新安装 auctex。对不起,我没有想到。它是字节编译的,不知道 dbus 支持。请发表您的评论作为答案,以便我接受。 【参考方案1】:

错误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 实例中,我们会突然到达有问题的行,并尝试将宏作为函数调用,但失败并显示 @ 987654329@。这就是为什么在加载到支持 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 是一个宏。

【讨论】:

就我而言,这是 auctex-package 中的内容,因此重新安装该软件包就足够了。谢谢!

以上是关于Emacs:尝试切换到乳胶模式时出现与 dbus 相关的错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 pdcurses 扩展库时出现与 gdi32 相关的错误

emacs中的dbus错误

在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。 错误号: 2 严重性: 20 状态: 0

如何定义键绑定以在 emacs 中的次要模式之间切换?

在 Emacs 中使用 rime 输入法

dbus 方法中的错误类型错误(GNU Emacs)