Quando dovrei usare il caricamento automatico invece di richiedere?


30

Da quello che ho capito requireè usato per caricare grossi pezzi di codice (qualcosa come moduli) sebbene possa anche caricare singole funzioni.

Autoload dall'altro lato, registra solo le funzioni e difende il caricamento al tempo di esecuzione.

Di recente ho letto un articolo che sostiene l'uso autoloadesclusivo di.

È meglio autoloadche a require? Quali sono alcuni casi d'uso tipici per ognuno di questi?


3
@Gilles: FWIW, non sono d'accordo con la tua rimozione dei tag autoloade requireda questa domanda. L'aggiunta di tag librariesandava bene, ma ora chiunque cerchi, utilizzando i tag, per domande su autoloado requirenon troverà questo. Queste sono entrambe importanti funzioni di Emacs-Lisp che le persone cercheranno. Peccato. E pensa a quanto sarà utile elispe libraries(in particolare elisp) nella pratica di un sito Emacs: non si distinguono molto in Emacsland, temo. (Ma no, non sono contrario ad averli e ad usarli.)
Disegnò il

@Drew Vado dalla meta discussione applicabile . Se ritieni che questo principio generale non si applichi qui, per favore sollevalo su meta.
Gilles 'SO- smetti di essere malvagio' il

1
@Gilles: Fatto . Sì, l'ho letto e ho pensato che forse era quello che ti aveva motivato. Non sono in disaccordo con molti principi generali. Ciò non significa che seguirli in modo generalizzato sia sempre TRT.
Ha

2
Concordo con Drew: poiché questa domanda riguarda specificamente la distinzione dei casi d'uso autoloade requirepenso che tali tag siano giustificati. In effetti, etichettare questa domanda [solo] con librariesè troppo generalizzante. Io per primo uso requireper innescare il caricamento di "my-foobar-cfg", che, come suggerisce il nome, contiene solo la mia configurazione, non una libreria.
paprika,

Risposte:


28

autoloadnon è un sostituto per require. In genere requireviene utilizzato per assicurarsi che venga caricato un determinato file. autoloadd'altra parte fornisce a Emacs un suggerimento su quale file trovare una determinata funzione senza caricare immediatamente il file. Solo quando viene chiamata la funzione caricata automaticamente viene caricato il file corrispondente.

Fondamentalmente con autoloadte puoi ritardare il caricamento di un intero file al momento in cui ne hai davvero bisogno. Questo è il motivo per cui i pacchetti (specialmente quelli di grandi dimensioni) in genere definiscono le loro funzioni di immissione come autoloads.

Se vuoi fare personalizzazioni pesanti per un pacchetto di solito non sei fortunato autoload. Se si desidera ancora evitare, requireè possibile rinviare le personalizzazioni fino a dopo che il file è stato caricato utilizzando eval-after-load.

Il manuale di Emacs tratta questo argomento nelle seguenti sezioni:


2
Forse vale la pena menzionare anche: autoloadè (più o meno) nel fornire definizioni dei comandi, quindi puoi usare quei comandi. requiresi tratta di rendere tutto disponibile in una biblioteca (e nelle biblioteche che la biblioteca richiede, ricorsivamente). Emacs offre molto di più dei comandi. (Ma sì, ovviamente una volta invocato un comando a caricamento automatico, viene caricata l'intera libreria.)
Disegnato il

4

In termini di inizializzazione di Emacs, non fare alcuna scelta. L'utente di GitHub jwiegley ha l'eccellente macro di dichiarazione del pacchetto d'uso , che richiederà o caricherà automaticamente un pacchetto in base alle necessità. Meglio usato per rinviare il caricamento di pacchetti che possono essere caricati su richiesta.


3

Se vuoi che una determinata funzione sia caricata e disponibile direttamente all'avvio di Emacs, usa richiedi, altrimenti usa il caricamento automatico. Personalmente apprezzo molto il tempo di avvio (in realtà riavvio Emacs un paio di volte alla settimana, a volte più volte al giorno), quindi accetto che ci vorrà un po 'di tempo quando Emacs carica automaticamente una determinata funzione quando ne ho bisogno. Quindi, pensa a cosa vuoi essere disponibile direttamente dopo l'avvio di Emacs e cosa può essere caricato quando necessario.

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.