2015-04-01 38 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