Jak skompilować bajtowo wszystko w moim katalogu .emacs.d?

138

Zdecydowałem się sprawdzić Emacsa i bardzo mi się spodobał. Teraz używam Emacsa Starter Kit , który zapewnia lepsze ustawienia domyślne i kilka fajnych dostosowań do domyślnej instalacji Emacsa.

Trochę go dostosowałem, dodałem kilka rzeczy, takich jak yasnippet , motywy kolorów , niezwiązane i inne rzeczy. Skonfigurowałem repozytorium github, w którym przechowuję wszystkie dostosowania, aby mieć do nich dostęp z wielu miejsc lub na wypadek, gdyby coś poszło źle i straciłem katalog .emacs.d.

Wszystko to jest bardzo przyjemne, ale jest problem: ładowanie Emacsa zajmuje około 1-2 sekund. AFAIK Mogę skompilować pojedyncze pliki .el z plikiem kompilacji bajtów Mx do .elc i to działa. Ale jest wiele plików .el i zastanawiam się, czy istnieje sposób na skompilowanie ich wszystkich za pomocą prostego polecenia lub czegoś w tym rodzaju, aby przyspieszyć ładowanie Emacsa. Mój Emacs nie zawsze jest otwarty, a ja otwieram go i zamykam dość często, zwłaszcza po ustawieniu go jako domyślnego edytora dla poleceń edycji w Total Commander, aby szybciej się do niego przyzwyczaić (tak, tutaj windows xp).

Moja wersja Emacsa to 22.3. I tak, domyślna instalacja Emacsa bez żadnych dostosowań uruchamia się natychmiast.

Nie jestem pewien, która wersja jest preferowana podczas ładowania, przy okazji .el czy skompilowany .elc Oo

Czy jest więc polecenie elisp lub przełącznik wiersza poleceń Emacsa, który zmusiłby Emacsa do kompilacji bajtowej wszystkiego w katalogu .emacs.d?

Mikka
źródło

Odpowiedzi:

208

C-u 0 M-x byte-recompile-directory

skompiluje wszystkie pliki .el w katalogu i we wszystkich podkatalogach poniżej.

Chodzi o C-u 0to, aby nie pytał o każdy plik .el, który nie ma odpowiednika .elc.

Laurynas Biveinis
źródło
9
A potem (gdy każdy został skompilowany raz), po prostu użyj tego samego polecenia bez C-u 0(aka C-0, BTW). To będzie kompilować bajtowo tylko te pliki źródłowe, które są nowsze niż ich wersje skompilowane bajtowo.
Drew
1
Mała uwaga: dla mnie to nie zadziałało, dopóki nie usunąłem wszystkich odpowiednich plików «.elc». Po prostu powiedział coś w stylu „Gotowe, 0 plików skompilowanych, pliki α pominięte”.
Hi-Angel,
1
@ Cześć Angel, mam ten sam problem. Znalazłeś jakieś rozwiązanie?
zhanxw
@zhanxw yep. Niestety polecenie kompiluje tylko pliki, które uległy zmianie lub nie mają odpowiednika „.elc”. Aby ponownie skompilować wszystko w katalogu, musisz najpierw usunąć wszystkie pliki «.elc».
Hi-Angel
2
Interaktywne polecenie niestety tego nie ujawnia, ale jeśli wywołasz funkcję bezpośrednio, możesz użyć opcjonalnego argumentu, FORCEaby ponownie skompilować pliki, które mają już skojarzony ".elc", nawet jeśli nie są starsze niż plik źródłowy:M-: (byte-recompile-directory "/the/directory/" 0 t)
jbm
44

Aby automatycznie kompilować bajtowo wszystko, co wymaga kompilacji bajtów za każdym razem, gdy uruchamiam emacsa, po wprowadzeniu zmian umieszczam load-pathna górze mojego .emacspliku:

(byte-recompile-directory (expand-file-name "~/.emacs.d") 0)

O dziwo, nie dodaje to wiele czasu do uruchomienia (chyba, że ​​coś trzeba skompilować).

Aby przyspieszyć emacsa, najpierw zidentyfikowałem wolne części za pomocą profile-dotemacs.el, a następnie zastąpiłem je automatycznymi ładowaniami .

Richard Hansen
źródło
dokumentacja autoloadów została przeniesiona. To i odniesienie do profilu dotemacs.el są dokładnie tym, czego potrzebowałem, kiedy natknąłem się na tę stronę.
Digicrat
24

Możesz użyć --batchflagi, aby ponownie skompilować z wiersza poleceń.

Aby ponownie skompilować wszystko, zrób

emacs --batch --eval '(byte-recompile-directory "~/.emacs.d")'

lub przekompilować pojedynczy plik tak jak z Makefile,

emacs --batch --eval '(byte-compile-file "your-elisp-file.el")'
Mike Samuel
źródło
5
zamiast tego użyj kompilacji wsadowej bajtów .
npostavs
1
Czy mógłbyś, jak go używać?
nacho4d
8
@ nacho4d emacs -Q --batch -f batch-byte-compile *.el foo/*.el- nie powtarza się tak jak byte-recompile-directory .
Brian Burns
3
Prawdopodobnie chcesz dodać argument wymuszający rekompilację, np. emacs --batch --eval '(byte-recompile-directory "~ / .emacs.d" 0)'
Ibrahim
17

To trochę się waha od pytania, ale aby rozwiązać problem powolnego ładowania, możesz użyć nowej funkcji demona w Emacs 23.

„Jeśli masz dużo pakietów pomocniczych, uruchamianie emacsa może być nieco powolne. Jednak emacs 23 oferuje emacs --daemon, który umożliwia uruchamianie emacsa w tle (na przykład podczas logowania). nowe okna (ramki) emacsa za pomocą emacsclienta. Oczywiście, mógłbyś mieć już serwer emacsa w starszych wersjach, ale możliwość uruchamiania go w tle sprawia, że ​​jest to znacznie przyjemniejsze rozwiązanie "

Od http://emacs-fu.blogspot.com/2009/07/emacs-23-is-very-near.html

mwilliams
źródło
Zdecydowanie to sprawdzę. Dziękuję Ci!
Mikka
2
Jeśli dodasz alias emacs = 'emacsclient -nw -a "" -c' do twojego .bashrc (lub wersji twojej powłoki), najpierw spróbuje połączyć się z uruchomionym demonem, jeśli taki istnieje, jeśli nie, uruchomi go i połączy ty.
Frederick
2

W przypadku korzystania z spacemacs polecenie brzmi spacemacs/recompile-elpa. Polecenie byte-recompile-directorynie kompiluje żadnego pliku.

Yu Shen
źródło
2
Różne rzeczy. ELPA / MELPA ma zdefiniowane metody budowania w swojej własnej hierarchii archiwum. byte-recompile-directory próbuje skompilować wszystkie pliki .el w katalogu zdefiniowanym przez użytkownika.
RichieHH