Come faccio a compilare byte tutto nella mia directory .emacs.d?


138

Ho deciso di dare un'occhiata a Emacs e mi è piaciuto molto. Ora sto usando l' Emacs Starter Kit , che in qualche modo fornisce impostazioni predefinite migliori e alcune belle personalizzazioni all'installazione predefinita di Emacs.

L'ho personalizzato un po ', ho aggiunto alcune cose come yasnippet , temi di colore , non associati e altre cose. Ho creato un repository github in cui mantengo tutte le personalizzazioni in modo da poterle accedere da più punti o nel caso qualcosa vada male e perdo la mia directory .emacs.d.

Tutto questo è molto bello, ma c'è un problema: Emacs impiega circa 1-2 secondi per caricarsi. AFAIK Posso compilare singoli file .el con Mx byte-compile-file in .elc, e funziona. Ma ci sono molti file .el e mi chiedo se esiste un modo per compilarli tutti con un semplice comando o qualcosa del genere, per accelerare il caricamento di Emacs. Il mio Emacs non è sempre aperto e lo apro e lo chiudo abbastanza frequentemente, soprattutto dopo averlo impostato come editor predefinito per il comando di modifica in Total Commander per abituarsi più velocemente (sì, Windows XP qui).

La mia versione di Emacs è la 22.3. E sì, l'installazione predefinita di Emacs senza alcuna personalizzazione si avvia all'istante.

Non sono sicuro quale versione sia preferita durante il caricamento, il .el o .elc compilato uno a proposito Oo

Quindi, esiste un comando elisp o un'opzione della riga di comando di Emacs per rendere Emacs compilare byte tutto nella directory .emacs.d?

Risposte:


208

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

compilerà tutti i file .el nella directory e in tutte le sottodirectory di seguito.

La C-u 0parte è fare in modo che non chieda di ogni file .el che non ha una controparte .elc.


9
E in seguito (una volta che ciascuno è stato compilato una volta), basta usare lo stesso comando senza C-u 0(aka C-0, BTW). Che compilerà byte solo quei file di origine più recenti delle loro versioni compilate byte.
Ha

1
Una piccola nota: per me che non ha funzionato fino a quando non ho rimosso tutti i file «.elc» corrispondenti. Diceva qualcosa come «Fatto, 0 file compilati, file α saltati».
Ciao Angelo

1
@ Ciao Angelo, ho lo stesso problema. Hai trovato una soluzione?
zhanxw,

@zhanxw yep. Sfortunatamente il comando compila solo i file che sono stati modificati o che non hanno una controparte «.elc». Quindi per ricompilare tutto in una directory devi prima eliminare tutti i file «.elc».
Ciao Angelo,

2
Sfortunatamente il comando interattivo non lo espone, ma se si chiama la funzione direttamente è possibile utilizzare l'argomento facoltativo FORCEper ricompilare i file che hanno già un ".elc" associato anche se non sono più vecchi del file di origine:M-: (byte-recompile-directory "/the/directory/" 0 t)
jbm

44

Per compilare automaticamente byte tutto ciò che ha bisogno di compilare byte ogni volta che avvio emacs, inserisco quanto segue dopo le mie modifiche load-pathin cima al mio .emacsfile:

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

Sorprendentemente, non aggiunge molto al mio tempo di avvio (a meno che qualcosa non debba essere compilato).

Per accelerare i miei emacs, ho prima identificato le parti lente usando profile-dotemacs.el e poi le ho sostituite con i caricamenti automatici .


la documentazione dei caricamenti automatici è stata spostata. Questo e il riferimento profilo-dotemacs.el sono esattamente ciò di cui avevo bisogno quando mi sono imbattuto in questa pagina.
Digicrat

24

È possibile utilizzare il --batchflag per ricompilare dalla riga di comando.

Per ricompilare tutto, fare

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

o per ricompilare un singolo file come da un Makefile,

emacs --batch --eval '(byte-compile-file "your-elisp-file.el")'

5
utilizzare invece batch-byte-compile .
npostavs

1
Potresti come usarlo?
nacho4d

8
@ nacho4d emacs -Q --batch -f batch-byte-compile *.el foo/*.el- non si attacca come fa però la directory di ricompilazione byte .
Brian Burns,

3
Probabilmente vuoi aggiungere un argomento per forzare la ricompilazione, ad es. emacs --batch --eval '(byte-recompile-directory "~ / .emacs.d" 0)'
Ibrahim

17

Questo sta ondeggiando un po 'dalla domanda, ma per risolvere il problema del caricamento lento puoi usare la nuova funzionalità demone in Emacs 23.

"Se hai molti pacchetti di supporto, l'avvio di emacs può essere un po 'lento. Tuttavia, emacs 23 porta emacs --daemon, che ti consente di avviare emacs in background (ad esempio quando accedi). Puoi immediatamente pop nuove emacs windows (frame) con emacsclient. Ovviamente, potresti già avere un "server" emacs nelle versioni precedenti, ma essere in grado di avviarlo in background rende questa soluzione molto più piacevole "

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


Lo controllerò sicuramente. Grazie!
Mikka,

2
Se aggiungi alias emacs = 'emacsclient -nw -a "" -c' al tuo .bashrc (o alla versione della tua shell) proverà prima a connettersi a un demone in esecuzione se ce n'è uno, in caso contrario ne avvierà uno e si connetterà tu.
Federico,

2

Per il mio utilizzo di spacemacs, il comando è spacemacs/recompile-elpa. Il comando byte-recompile-directorynon compila alcun file.


2
Cose differenti. Le cose ELPA / MELPA hanno definito i metodi di costruzione nella propria gerarchia di archivi. byte-recompile-directory tenta di compilare tutti i file .el in una directory definita dall'utente.
RichieHH,
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.