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?
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ń!
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.
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.
auto-compile
biblioteki (doskonała!) W Emacs 24.4+, a także poniżej. To prawdziwe rozwiązanie do konfiguracji i zapomnienia.load-prefer-newer
zapewnia tylko, że będziesz nadal uruchamiał powolny nieskompilowany kod po tym, jak skompilowany kod stanie się nieaktualny.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-mode
ponownie skompiluje nieaktualne.elc
pliki przed ich załadowaniem.źródło
Spotkałem to w Internecie dawno temu:
jeśli pracujesz
FILE
w trybie emacs-lisp i zapiszesz go - powyższy kod usuwa,FILEc
jeśli istnieje.źródło
Czy mogę zasugerować dodanie haka do pliku init?
Lub, jeśli chcesz zastosować zaczep tylko do plików el:
źródło