2015-04-01 14 views
5

seit ich dbus vor einigen Tagen mit Emacs benutzt habe (was ich mit dbus-support rekompiliert habe), wenn ich eine Latex-Datei öffne oder manuell auf Latex umschalte -Modus, bekomme ichEmacs: dbus-bezogener Fehler beim Wechsel in den Latex-Modus

und Emacs bleibt dort im Grundmodus bleiben.

Ich benutze dbus für Zeitgeist-Support und das funktioniert gut und bis zur Neukompilierung funktionierte Auctex gleich gut. Ich habe überprüft, ob die dbus-Funktionen mit dem Ergebnis verfügbar sind: Sie erscheinen in der Hilfe (einschließlich "dbus-ignore-errors"), aber sie scheinen nicht für execute-extended-commad (Mx) verfügbar zu sein wird nicht vollständig angezeigt und kann nicht ausgeführt werden. Auf der anderen Seite sind sie für lisp-eval verfügbar.

Ich weiß nicht, ob das für diese Funktionen normales Verhalten ist, aber irgendwie scheint es ein Problem mit der Verfügbarkeit der Funktionen für auctex zu geben?

Die Situation ändert sich nicht durch Deaktivieren des Zeitgeist-Plugins.

Irgendwelche Vorschläge?

Mit freundlichen Grüßen

Matthias

+0

Geben Sie 'Mx toggle-debug-on-error' ein, reproduzieren Sie das Problem und senden Sie dann den Stacktrace, damit jemand bessere Chancen hat, zu helfen – juanleon

+0

Vielleicht geben Sie ein Beispiel, wie Sie mit 'emacs -Q anfangen '. –

+0

Es scheint, als ob der Fehler in einer bytekompilierten Emacs-Lisp-Datei auftritt, die kompiliert wurde, ohne zu wissen, dass 'dbus-ignore-errors' ein Makro ist. Finden Sie heraus, welche Datei den StackTrace verwendet und kompilieren Sie sie nach dem Laden des 'dbus' Moduls. – legoscia

Antwort

3

Der Fehler invalid-function in der Regel bedeutet, dass ein Stück von Emacs Lisp-Code kompiliert wurde, bevor ein bestimmtes Makro definiert wurde, und nun versucht, diese Makro als Funktion aufzurufen. Um dies zu lösen, suchen Sie das betreffende Modul und kompilieren Sie es erneut, nachdem Sie sichergestellt haben, dass das Makro (dbus-ignore-errors in diesem Fall) definiert ist.


Im Falle auctex geschieht dies, weil tex.el enthält folgende Komponenten:

;; 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))) 

Das heißt, er versucht, die dbus-Bibliothek zu laden, ignoriert aber Ausfälle. Wenn der Emacs, unter dem Auctex kompiliert wird, dbus nicht unterstützt, wird dbus-ignore-errors somit in einen Funktionsaufruf kompiliert, wenn tex.el kompiliert wird. Das ist kein Problem, da der dbus-ignore-errors Aufruf durch einen featurep Test geschützt ist.

Wenn dieses Byte-kompilierte Datei dann in einen Emacs-Instanz geladen wird, dass tut Unterstützung dbus, wir die Linie in Frage plötzlich erreichen, und versuchen, das Makro als eine Funktion aufzurufen, die mit invalid-function ausfällt. Aus diesem Grund muss die Datei neu kompiliert werden, bevor sie in einen dbus-fähigen Emacs geladen wird.

Eine Möglichkeit, dies zu lösen, ist die dbus-ignore-errors Linie in eval wickeln, Ändern Sie diese Zeile:

 (dbus-ignore-errors (dbus-get-unique-name :session)) 

dazu:

 (eval '(dbus-ignore-errors (dbus-get-unique-name :session))) 

, dass die Entscheidung verschieben würde, wie dieser Ausdruck auszuwerten bis zur Laufzeit, wenn Emacs wissen, dass dbus-ignore-errors ein Makro ist.

+0

In meinem Fall war es etwas im auctex-Paket, so dass die Neuinstallation des Pakets ausreichend war. Vielen Dank! – mat