2015-04-01 19 views
5

,因为我开始使用Emacs的DBUS一些天前(意思是我与DBUS支持重新编译),当我打开一个乳胶文件或尝试手动切换到乳胶模式,我得到的Emacs:dbus的相关尝试切换到乳胶模式时,错误

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

和emacs停止在那里保持在基本模式。

我使用的dbus的时代精神,支持和工作正常,直到重新编译,Auctex工作同样良好。我检查,如果DBUS,功能都可以与结果:在他们的帮助下(包括“DBUS-忽略-错误”)显示出来,但他们似乎并没有可供执行,扩展commad(MX)意味着他们不完成时不出现,不能执行。另一方面,它们可用于lisp-eval。

我不知道这是对这些功能的正常行为,但无论如何,似乎有某种与对auctex功能的可用性的问题的?

的情况不被禁止的时代精神,插件改变。

有什么建议吗?

此致

的Matthias

+0

键入'Mx toggle-debug-on-error',重现问题,然后发布堆栈跟踪,以便有人可能有更好的机会帮助 – juanleon 2015-04-01 11:09:03

+0

也许你提供了一个例子,你如何运行它,从'emacs -Q '。 – 2015-04-01 11:27:59

+0

这似乎是错误发生在字节编译的Emacs Lisp文件中,它是在不知道'dbus-ignore-errors'是一个宏的情况下编译的。查找该文件正在使用堆栈跟踪,并在加载'dbus'模块后重新编译它。 – legoscia 2015-04-01 12:21:36

回答

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被编译器不支持DBUS Emacs的,dbus-ignore-errors因此将编译tex.el当编译成一个函数调用。这没有问题,因为dbus-ignore-errors呼叫受到featurep测试的保护。

如果这个字节编译的文件,然后装入一个Emacs实例确实支持DBUS,我们突然到达,这个行,并尝试调用宏的功能,它失败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是一个宏。

+0

就我而言,它是auctex包中的东西,因此重新安装包是足够的。谢谢! – mat 2015-04-02 09:03:01