Czy mogę uniknąć nieaktualnych plików elisp skompilowanych bajtowo?

27

Czasami, kiedy uruchamiam Emacsa, pojawia się komunikat „jak”.

Plik źródłowy `/home/USER/.emacs.d/elpa/....el 'nowszy niż plik skompilowany bajtowo

Ponadto czasami edytuję pakiet, który opracowuję, i zapominam o jego ponownej kompilacji. Kiedy próbuję załadować nowy plik, zajęło mi trochę czasu, aby zrozumieć, że Emacs nadal używa starego skompilowanego pliku.

Czy jest sposób, w jaki mogę powiedzieć Emacsowi, aby całkowicie unikał plików skompilowanych w bajtach, które są starsze niż odpowiednie pliki źródłowe?

Malabarba
źródło

Odpowiedzi:

35

Emacs 24.3 lub niższy

Nie ma wbudowanego sposobu zapobiegania ładowaniu tych starych plików, ale istnieją proste sposoby, aby się ich pozbyć.

  • Można rekompilacji całego katalogu ELPA pod numerem:
    M-x byte-recompile-directory RET ~/.emacs.d/elpa/.
    To powinno pozbyć się nieaktualnych plików.
  • Możesz użyć pakietu autokompilacji i aktywować, auto-compile-on-load-modektóry może kompilować pliki przed ich załadowaniem.

Emacs 24.4

Tak, i okazuje się to dość proste. load-prefer-newer Zmienna służy właśnie temu celowi.

(setq load-prefer-newer t)

Niestety nie zadziała, gdy jakiś kod celuje w konkretny .elcplik, np (load "server.elc"). Ale powinno wystarczyć, o ile używasz requires lub dzwonisz loadbez przyrostka, co powinieneś.

Z dokumentu:

load-prefer-newer to zmienna zdefiniowana w lread.c.
Jego wartość wynosi zero

Dokumentacja:
Non-zero oznacza, że ​​load woli najnowszą wersję pliku.
Ma to zastosowanie, gdy sufiks nazwy pliku nie jest jawnie określony, a load próbuje różnych możliwych sufiksów (patrz sufiksy load i sufiksy rep-load-file). Zwykle zatrzymuje się na pierwszym istniejącym pliku, chyba że wyraźnie określisz jeden lub drugi. Jeśli ta opcja jest inna niż zero, sprawdza wszystkie sufiksy i używa dowolnego pliku, który jest najnowszy.
Pamiętaj, że jeśli to dostosujesz, oczywiście nie wpłynie to na pliki ładowane przed odczytaniem twoich dostosowań!

Malabarba
źródło
1
Zachęcam ludzi do korzystania z auto-compilebiblioteki (doskonała!) W Emacs 24.4+, a także poniżej. To prawdziwe rozwiązanie do konfiguracji i zapomnienia. load-prefer-newerzapewnia tylko, że będziesz nadal uruchamiał powolny nieskompilowany kod po tym, jak skompilowany kod stanie się nieaktualny.
phils,
1
@phils Dzisiejszy bajtowy kod nie jest dużo szybszy niż zwykły kod źródłowy, dzięki szybkiej ekspansji makr.
lunaryorn
Zmiany, które wprowadziłem w org-agenda-sorting-strategia (in org-agenda.el) nie były odzwierciedlone po ponownym uruchomieniu, ale rekompilacja plików .elc zgodnie z opisem w odpowiedzi rozwiązała problem.
earlio
17

Jeśli ustawisz tylko load-prefer-newer(jeśli jest dostępny), poprawny kod zostanie załadowany, ale być może nie został skompilowany bajtowo, więc może wystąpić niewielki spadek wydajności.

Możesz użyć doskonałej biblioteki auto-kompilacji Jonasa Bernoulli, aby upewnić się, że ten problem nie wystąpi. W szczególności auto-compile-on-load-modeponownie skompiluje nieaktualne .elcpliki przed ich załadowaniem.

sanityinc
źródło
3

Spotkałem to w Internecie dawno temu:

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

jeśli pracujesz FILEw trybie emacs-lisp i zapiszesz go - powyższy kod usuwa, FILEcjeśli istnieje.

Cegła suszona na słońcu
źródło
0

Ponadto czasami edytuję pakiet, który opracowuję, i zapominam o jego ponownej kompilacji. Kiedy próbuję załadować nowy plik, zajęło mi trochę czasu, aby zrozumieć, że Emacs nadal używa starego skompilowanego pliku.

Czy mogę zasugerować dodanie haka do pliku init?

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

Lub, jeśli chcesz zastosować zaczep tylko do plików el:

(add-hook 'emacs-lisp-mode-hook (lambda () (add-hook 'after-save-hook 'byte-compile-current-buffer nil t)))
Nsukami _
źródło
9
Whoah, to próbowałoby skompilować bajty nawet bufory inne niż elisp. Nieidealny! Solidnym sposobem na to jest pakiet auto-kompilacji.
sanityinc