2015-04-01 28 views
5

da quando ho iniziato a utilizzare dbus con Emacs alcuni giorni fa (ovvero con ricompilazione con dbus-support), quando apro un file in lattice o provo a passare manualmente a latex -Mode, ottengoEmacs: errore relativo a dbus durante il tentativo di passare alla modalità lattice

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

e emacs si ferma lì rimanendo in modalità fondamentale.

Io uso dbus per Zeitgeist-Support e che funziona bene e fino alla ricompilazione, Auctex ha funzionato egualmente bene. Ho verificato se le funzioni dbus sono disponibili con il risultato: vengono visualizzate nell'help (inclusi "errori dbus-ignore") ma non sembrano essere disponibili per execute-extended-commad (Mx) che significa che non si presenta in completamento e non può essere eseguito. D'altra parte sono disponibili per il Lisp-Eval.

Non so se questo è un comportamento normale per queste funzioni, ma comunque sembra esserci un qualche problema con la disponibilità delle funzioni per auctex?

La situazione non cambia disattivando il plugin zeitgeist.

Qualche suggerimento?

migliori saluti

Matthias

+0

Digitare 'Mx toggle-debug-on-error', riprodurre il problema e quindi postare lo stacktrace in modo che qualcuno possa avere maggiori possibilità di aiuto – juanleon

+0

Forse si fornisce un esempio di come si esegue questo, iniziando con' emacs -Q '. –

+0

Sembra che l'errore si verifichi in un file Lisp Emacs compilato in byte, che è stato compilato senza sapere che 'dbus-ignore-errors' è una macro. Trova che file utilizza lo stacktrace e ricompila dopo aver caricato il modulo 'dbus'. – legoscia

risposta

3

L'errore invalid-function di solito significa che un pezzo di codice Emacs Lisp è stato compilato prima di una certa macro è stata definita, e sta ora cercando di chiamare quella macro come una funzione. Per risolvere questo, trovare il modulo in questione e ricompilarlo dopo aver verificato che la macro (dbus-ignore-errors in questo caso) sia definita.


Nel caso di AucTeX, questo avviene perché tex.el contiene:

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

Cioè, si cerca di caricare la libreria dbus, ma ignora guasti. Se gli Emacs con cui Auctex viene compilato non supporta dbus, dbus-ignore-errors verrà quindi compilato in una chiamata di funzione durante la compilazione di tex.el. Questo non è un problema, perché la chiamata dbus-ignore-errors è protetta da un test featurep.

Se questo file byte-compilato viene quindi caricato in un'istanza di Emacs che fa supporto dbus, improvvisamente raggiungere la linea in questione, e provare a chiamare la macro come una funzione, che non riesce con invalid-function. Ecco perché il file deve essere ricompilato prima di essere caricato in un Emacs abilitato a dbus.

Un modo per risolvere questo è quello di avvolgere la linea dbus-ignore-errors in eval, cambiando questa linea:

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

a questo:

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

Che sarebbe rinviare la decisione su come valutare questa espressione fino al runtime, quando Emacs saprà che dbus-ignore-errors è una macro.

+0

Nel mio caso, era qualcosa nel pacchetto auctex, quindi la reinstallazione del pacchetto era sufficiente. Grazie! – mat