TL; DR Ho una quantità così grande di pacchetti che sta danneggiando il mio tempo di avvio. Se non credete che potrebbe essere il caso, continuate a leggere.
Il tempo di avvio di My Emacs è piuttosto ridotto. Non lo uso use-package
, ho appena impostato tonnellate di hook e autoload
s in modo che quasi tutto il codice venga rinviato. In realtà il tutto viene caricato di solito in meno di mezzo secondo, nonostante sembri un casino folle.
Tuttavia, nel corso del tempo ho notato che il mio tempo di avvio viene minuziosamente più lento, inspiegabilmente. Questo alla fine è arrivato al punto in cui il tempo di avvio è ≥ 1 secondo. Alla fine ne ho avuto abbastanza e ho scavato nella radice del problema. Alla fine ho commentato tutto il mio ~/.emacs
file e ho scoperto che il tempo di avvio era ancora ≥ 1 secondo. In effetti, si era rasato solo ~ 0.2
secondi, a volte anche meno. Quindi ho provato emacs -q
e ho scoperto che il tempo di avvio era ~ 0.1
secondi.
Dopo aver esaminato questa sezione del manuale Elisp, ho scoperto perché emacs -q
stava riducendo così tanto i tempi di avvio. Apparentemente emacs -q
impedisce a Emacs di fare tre cose all'avvio:
- caricamento del file init
- caricamento del
default.el
file - chiamata
package-initialize
Abbiamo già escluso il mio file init, dal momento che commentare il mio intero ~/.emacs
non fa quasi nulla. Non uso un default.el
file, quindi anche questo è escluso. Il che lascia package-initialize
il colpevole del colpo di scena.
Perché package-initialize
impiegare così tanto tempo di avvio? Questa è stata la prima domanda che mi sono posto. Non sto caricando tutto automaticamente? Beh si. Ma questo è esattamente il problema.
Ho trovato questo post che spiega che "l'attivazione" dei pacchetti consiste nella lettura dei file di caricamento automatico e nell'impostazione dei percorsi di caricamento. Ciò comporta ovviamente una penalità I / O quando si hanno molti pacchetti perché si hanno molti file di caricamento automatico da leggere e molti percorsi da impostare. Sfortunatamente, senza questo, il compito di gestire i caricamenti automatici cade nelle mani dell'utente. In altre parole, senza lasciare package.el
scorrere il filesystem per i file e i percorsi di caricamento automatico, dovrei gestirlo da solo, il che potrebbe essere un processo noioso e soggetto a errori.
Preferirei non percorrere quella strada. Al momento ho 116 pacchetti, di cui 107 di quelli ELPA e 25 dei quali sono dipendenze. Sono sicuro che questo numero enorme è ciò che sta degradando così tanto la mia performance. Ma sono in un dilemma perché non voglio rimuovere nessuno dei miei pacchetti.
Esiste un rimedio in una situazione del genere per riavere il mio tempo di avvio del lampo?
Aggiornare:
Abbiamo iniziato un nuovo thread nella emacs-devel
mailing list su alcune patch di Stefan Monnier (una descrizione di queste patch è qui ) per risolvere questo problema. Chiunque è invitato a testare le proprie patch e fornire feedback.
Un altro aggiornamento:
Sembra che Stefan Monnier o non sia più interessato a questo problema o non stia ricevendo i miei messaggi. Sono propenso a credere al primo, il che va bene, anche se apprezzerei un qualche tipo di risposta da parte sua se fosse così. Ad ogni modo, il codice che ha prodotto per questo problema finora funziona abbastanza bene. Le sue patch più recenti sono disponibili qui (per Emacs 25.3) e qui (per il ramo master di Emacs).Ho visto buoni miglioramenti nel mio tempo di avvio grazie alle sue patch e sono a un punto in cui mi sento a mio agio con il mio tempo di avvio in quanto è ottimizzato il più possibile senza tagliare le funzionalità della mia personalizzazione. Speravo che queste patch sarebbero entrate nella linea principale di Emacs ad un certo punto, ma immagino che io (o qualcun altro) avrei dovuto prendere la torcia per ora, invece di Stefan. Avevamo un po 'di parsimonia nella mailing list sull'assegnazione del copyright e le licenze. Inizialmente ero a disagio nel farlo, ma a causa di alcuni commenti di Richard Stallman e altri, la cessione del copyright potrebbe non essere così restrittiva come pensavo inizialmente. Inoltre, potrebbe essere possibile per me affidare le mie opere di dominio pubblico in alternativa all'assegnazione del copyright.
In ogni caso, grazie Stefan per le patch finora! Spero che continuerai a sviluppare questi cambiamenti, ma in caso contrario, va bene e potrei continuare a svilupparli ad un certo punto. Ringrazio anche tutti gli altri che hanno offerto spunti e contributi per risolvere questo problema.
Ancora un altro aggiornamento:
Wow, sembra che questa funzione sia finalmente arrivata e sarà in Emacs 27. Grazie a Stefan Monnier!
use-package
è la strada da percorrere per questo.