In che modo Emacs riesce a avviarsi istantaneamente con molti file el?


11

Come tutti gli Emacs sapranno, attualmente sto soffrendo della mia vasta configurazione dot-Emacs. Tutti i miei pacchetti sono all'interno dei contenitori use-packagee ho compilato tutti i miei file .el. Anche con questo, Emacs inizia in 6,4 secondi, quindi carica il resto dei pacchetti (circa 40 di essi) in seguito.

Stavo pensando ad altri modi per risolvere il lungo tempo di avvio, poi ho notato qualcosa. Emacs predefinito (senza configurazione utente) utilizza molte .ellibrerie, incluse in ogni Emacs. Si trovano in \shares\emacs\version number\lisp\.

Anche con molti file lisp, riesce a iniziare in un secondo. Quando stavo ispezionando i file di molti pacchetti inclusi con l'Emacs predefinito, non ho trovato nulla di straordinario che potesse spiegare perché Emacs è riuscito ad avviarsi entro un secondo. Qualcuno potrebbe dirmi come gestisce Emacs, anche con migliaia di file .el?


1
Usi :defer tnelle tue use-packagedichiarazioni ove possibile?
lunaryorn

7
Numerose librerie di base in Emacs sono precaricate nell'eseguibile, tramite il meccanismo di dump utilizzato durante la creazione di Emacs, il che dà anche l'illusione di caricare molte cose in modo incredibilmente rapido. Vedi C-h i g (elisp) Building Emacsse sei interessato a saperne di più.
phils,

2
@phils: Sarebbe bello se potessi espandere il tuo commento a una risposta, sembra che il meccanismo di dump non sia ancora menzionato su Emacs-SE.
paprika,

e il mio ha 76 anni ..
Leu_Grady,

paprika: Fatto ..
phils l'

Risposte:


9

Qualcuno potrebbe dirmi come gestisce Emacs, anche con migliaia di file .el?

Emacs "gestisce" ciò non caricando all'avvio, quindi non trattenendo il caricamento dell'applicazione principale. Questo a sua volta come l'effetto di restituire all'utente il controllo della tastiera più velocemente.

Ma quando viene caricato? Al primo utilizzo di quella funzione, modalità o caratteristica.

Non rallenta? Sì, al primo utilizzo. Questo è il compromesso. Vuoi rallentare al momento dell'avvio di emacs o al primo utilizzo.

È evidente? Il caricamento all'avvio sembra richiedere più tempo poiché vengono caricate anche altre librerie di base. Ma al primo utilizzo sembra più veloce poiché viene caricata solo quella funzione del sottoinsieme.

Allora perché qualcuno dovrebbe caricare il carico all'avvio? Perché ad alcuni non dispiace aspettare di caricare tutte le librerie usate frequentemente all'avvio, quindi una volta caricate tutte le operazioni si svolgono rapidamente in seguito.

Come posso scegliere? Come Drew e altri hanno sottolineato nelle loro risposte a questa domanda, puoi usare il caricamento automatico e trucchi simili per controllare. Ma la considerazione più importante dovrebbe essere il tuo modello di utilizzo. Se ti capita di usare emacs come vi, aprendo e chiudendo costantemente, sì, il tempo di avvio diventa dolorosamente ovvio. D'altra parte, se usi emacs sempre in esecuzione, il tempo di avvio di 1 secondo o 1 minuto non sarà così evidente o abbastanza importante da curare.

Nota che puoi usare la modalità batch o Zile per l'avvio istantaneo durante il test, l'esecuzione o l'utilizzo di emacs come vi.

La mia preferenza è caricare all'avvio in modo che eventuali errori vengano colti in anticipo. Preferisco non dover affrontare eventuali errori di caricamento durante una giornata lavorativa quando ho innumerevoli buffer, modalità e stati di compilazione attivi insieme a diverse posizioni remote gestite da TRAMP. Il debug degli errori di caricamento automatico in tali condizioni non è molto piacevole.


10

Molte delle librerie incluse non vengono caricate all'avvio.

Alcuni comandi ecc. Sono caricati automaticamente , il che significa che Emacs li riconosce e sa come caricarli. Quando si tenta di utilizzare un comando caricato automaticamente, Emacs carica quindi la libreria che lo definisce, se non è stato ancora caricato.

Puoi creare i tuoi caricamenti automatici, sia per i tuoi comandi che per i comandi nelle librerie che non hai scritto. Vedere il manuale Elisp, nodo Autoload .


Conosciuto come caricamento lento, presumo? C'è qualche esempio di come si ottiene il caricamento lento, che verrà caricato solo quando viene chiamato?
ReneFroger,

Non sono sicuro di quello che stai chiedendo. Sì, potresti chiamarlo caricamento lento. Ci sono esempi e spiegazioni nel manuale Elisp. L'aggiunta di un cookie di caricamento automatico ( ;;;###autoload) appena prima di una definizione di comando nella libreria è un modo per dargli una definizione di caricamento automatico, assicurando che la sua libreria venga caricata quando qualcuno lo invoca.
Drew

... ma leggi quel link manuale per capire come / se questi cookie di caricamento automatico vengono elaborati. Il gestore pacchetti li gestisce per tutti i pacchetti ELPA. Altrimenti chiameresti (autoload...)direttamente nel tuo file init per registrarli.
phils,

Grazie per entrambe le risposte, è stato molto utile scoprirne di più!
ReneFroger,

9

Oltre alle altre risposte (che spiegano come la maggior parte delle librerie sia effettivamente caricata solo su richiesta), c'è anche la questione del pre-caricamento di molte librerie elisp di base all'interno emacsdell'eseguibile stesso, che fornisce l'illusione di caricare una molte cose incredibilmente velocemente.

Ciò si ottiene eseguendo una cosiddetta versione "nuda" di Emacs (che è ciò che è stato effettivamente compilato e che è completamente funzionale, ma contiene solo l'interprete elisp e altre funzionalità di base scritte in C), e dicendo che caricare tutte le librerie elisp che dovrebbero essere pre-caricate, prima di "scaricare" il emacsbinario effettivo con quelle librerie integrate.

Questo meccanismo è dettagliato nel manuale di elisp:
C-hig (elisp) Building Emacs RET

Se hai compilato Emacs da solo, puoi sperimentare questo processo e, se lo desideri, puoi persino scaricare versioni alternative dell'eseguibile finale (generalmente non raccomandato, ma la struttura è lì).

Il file temacsbinario compilato può essere trovato nella srcdirectory e puoi confrontare la differenza nei tempi di inizio eseguendo ciascuna versione in questo modo:

$ time ./temacs -l loadup --batch
$ time ./emacs --batch

Sul mio sistema il primo impiega ~ 4 secondi (durante i quali vengono caricate 111 librerie elisp), mentre il secondo impiega ~ 0,02 secondi.


@Phils molto simpatico per aver chiarito questo punto.
Utente Emacs,
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.