因为几天前我开始使用dbus和Emacs(意思是我用dbus-support重新编译),当我打开一个乳胶文件或尝试手动切换到乳胶模式时,我得到了
File mode specification error: (invalid-function dbus-ignore-errors)
并且emacs在基本模式中停止。
我使用dbus作为Zeitgeist-Support并且工作正常,直到重新编译,Auctex工作得同样好。我检查了dbus函数是否与结果一起可用:它们出现在帮助中(包括“dbus-ignore-errors”)但是它们似乎不适用于执行 - 扩展 - commad(Mx),这意味着它们不会在完成时出现并且无法执行。另一方面,它们可用于lisp-eval。
我不知道这些功能是否正常,但无论如何,auctex功能的可用性似乎存在某种问题?
通过禁用zeitgeist-plugin,情况不会改变。
有什么建议吗?
祝你好运
的Matthias
答案 0 :(得分:3)
错误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,则dbus-ignore-errors
将在编译tex.el
时编译为函数调用。这没问题,因为dbus-ignore-errors
调用受featurep
测试保护。
如果这个字节编译的文件然后加载到 支持dbus的Emacs实例中,我们突然到达相关的行,并尝试将宏调用为函数,该函数因{而失败{1}}。这就是为什么在加载到支持dbus的Emacs之前需要重新编译文件的原因。
解决此问题的一种方法是将invalid-function
行换行到dbus-ignore-errors
,更改此行:
eval
到此:
(dbus-ignore-errors (dbus-get-unique-name :session))
那将推迟决定如何评估该表达式直到运行时,当Emacs知道 (eval '(dbus-ignore-errors (dbus-get-unique-name :session)))
是宏时。