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 相关的错误