Posso evitare file elisp compilati in byte obsoleti?


27

Di tanto in tanto, quando avvio Emacs, ricevo un messaggio simile.

File di origine `/home/USER/.emacs.d/elpa/....el 'più recente del file compilato in byte

Inoltre, a volte modifico un pacchetto che sto sviluppando e dimentico di ricompilarlo. Quando provo a caricare il nuovo file, mi ci vuole un po 'per capire che Emacs sta ancora usando il vecchio file compilato.

C'è un modo in cui posso dire a Emacs di evitare completamente i file compilati in byte che sono più vecchi dei rispettivi file sorgente?

Risposte:


35

Emacs 24.3 o inferiore

Non esiste un modo integrato per impedire il caricamento di questi vecchi file, ma ci sono modi semplici per sbarazzarsi di loro.

  • È possibile ricompilare l'intera directory ELPA chiamando:
    M-x byte-recompile-directory RET ~/.emacs.d/elpa/.
    Questo dovrebbe sbarazzarsi di file obsoleti.
  • È possibile utilizzare il pacchetto di compilazione automatica e attivare auto-compile-on-load-modeche può compilare i file prima che vengano caricati.

Emacs 24.4

Sì, e risulta essere piuttosto semplice. La load-prefer-newer variabile serve proprio a questo scopo.

(setq load-prefer-newer t)

Sfortunatamente, non funzionerà quando alcuni codici hanno come target specifico il .elcfile, come (load "server.elc"). Ma dovrebbe essere sufficiente fintanto che stai usando requires o chiamando loadsenza un suffisso, che dovresti.

Dal documento:

load-prefer-newer è una variabile definita in lread.c.
Il suo valore è zero

Documentazione:
non zero significa che il caricamento preferisce la versione più recente di un file.
Ciò si applica quando un suffisso del nome file non viene specificato in modo esplicito e il caricamento sta provando vari possibili suffissi (vedere suffissi di caricamento e suffissi di caricamento file-rep-suffisso). Normalmente, si ferma al primo file esistente a meno che non si specifichi esplicitamente l'uno o l'altro. Se questa opzione è nulla, controlla tutti i suffissi e utilizza il file più recente.
Nota che se lo personalizzi, ovviamente non influenzerà i file caricati prima che le tue personalizzazioni vengano lette!


1
Vorrei esortare le persone a utilizzare la auto-compilelibreria (eccellente!) In Emacs 24.4+, così come sotto. È una vera soluzione da configurare e dimenticare. load-prefer-newergarantisce solo che continuerai a eseguire il codice non compilato lento dopo che il codice compilato non è aggiornato.
phils,

1
@phils Al giorno d'oggi il codice byte non è molto più veloce del semplice codice sorgente, grazie alla desiderosa espansione delle macro.
lunaryorn,

Le modifiche apportate a org-agenda-sorting-strategy (in org-agenda.el) non si riflettevano dopo un riavvio, ma la ricompilazione dei file .elc come descritto nella risposta ha risolto il problema.
earlio

17

Se si imposta solo load-prefer-newer(se disponibile), verrà caricato il codice corretto, ma potrebbe non essere stato compilato in byte, quindi potrebbe esserci una leggera penalità per le prestazioni.

È possibile utilizzare l'eccellente libreria di compilazione automatica di Jonas Bernoulli per assicurarsi che questo problema non si presenti. In particolare, auto-compile-on-load-modericompilerà i .elcfile obsoleti prima di caricarli.


3

L'ho incontrato su Internet molto tempo fa:

;; If you're saving an elisp file, likely the .elc is no longer valid:
(add-hook 'emacs-lisp-mode-hook 'esk-remove-elc-on-save)
(defun esk-remove-elc-on-save ()
  "If you're saving an elisp file, likely the .elc is no longer valid."
  (make-local-variable 'after-save-hook)
  (add-hook 'after-save-hook
            (lambda ()
              (if (file-exists-p (concat buffer-file-name "c"))
                  (delete-file (concat buffer-file-name "c"))))))

se lavori con FILEemacs-lisp-mode e lo salvi, il codice sopra rimuove FILEcse esiste.


0

Inoltre, a volte modifico un pacchetto che sto sviluppando e dimentico di ricompilarlo. Quando provo a caricare il nuovo file, mi ci vuole un po 'per capire che Emacs sta ancora usando il vecchio file compilato.

Posso suggerire di aggiungere un hook nel tuo file init?

(add-hook 'after-save-hook 'byte-compile-current-buffer)

Oppure, se si desidera applicare l'hook solo sui file el:

(add-hook 'emacs-lisp-mode-hook (lambda () (add-hook 'after-save-hook 'byte-compile-current-buffer nil t)))

9
Whoah, ciò proverebbe a compilare byte anche i buffer non elisp. Non ideale! Il modo più efficace per farlo è con il pacchetto di compilazione automatica.
sanityinc
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.