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.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
是一个宏。
自从几天前我开始将 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.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
是一个宏。