Un init pigro è un buon init.
(IMO)
Quando usare with-eval-after-load
with-eval-after-load
viene caricato una volta quando una determinata funzione o file viene caricato per la prima volta, quindi una modifica della keymap va chiaramente all'interno di una di queste. Non da ultimo perché la keymap potrebbe non essere nota al momento dell'inizializzazione [prova qualcosa come (define-key message-mode-map (kbd "C-c f") 'Footnote-add-footnote)
in emacs -q
]. Un hook non è una buona soluzione qui poiché associa la funzione a un tasto ogni volta che viene avviato l'hook. Come Tarsius note, è possibile leggere di più sul perché non al local-set-key
di ganci.
Infine, nota che with-eval-after-load
GNU Emacs 24.4 è un wrapper a 2 righe attorno al eval-after-load
quale body
non è necessario quotarlo.
Quando usare i ganci
Gli hook sono un elenco di funzioni caricate ogni volta che viene soddisfatto un criterio, ad esempio viene avviata una determinata modalità. Un uso comune di hook è caricare modalità secondarie, come flyspell-mode
o hl-line-mode
. Es (add-hook 'org-agenda-mode-hook 'hl-line-mode)
. Come sottolinea Rémi , add-hooks
è intelligente e farà la cosa giusta anche se la variabile hook non è ancora stata caricata. Tuttavia, ho molte clausole come le seguenti, che possono essere trascurabili per gli aumenti di velocità, ma danno un senso di organizzazione e struttura di dipendenza:
(with-eval-after-load 'org-agenda
(add-hook 'org-agenda-mode-hook 'hl-line-mode))
Perché aggiungere all'hook dopo org-agenda
? Come sempre, C-h v org-agenda-mode-hook C-j
offre. Il gancio è definito org-agenda.el
come mostrato in *help*
.
Caricamento di funzioni extra with-eval-after-load
with-eval-after-load
è anche importante per il caricamento di funzioni extra. Probabilmente vorresti qualcosa come (with-eval-after-load 'org (require 'org-inlinetask))
caricare org inlinetasks. Per vedere il perché (find-library "org-inlinetask")
. Dal momento che org-inlinetasks.el
direttamente (require 'org)
, tutto il bello autoload
che i tuoi amichevoli manutentori di Emacs si sono presi molta cura di fornire saranno "ignorati" e tutti org.el(c)
saranno caricati.
Ma cosa succede se il tuo (personale) defun
è richiesto in più posti? Se sei veramente esigente, potresti inserire le defun
s in un altro file nel tuo load-path
e aggiungere autoload
cookie, oppure puoi dire a Emacs dove trovare la funzione con la autoload
funzione. Quindi qualcosa del genere funzionerebbe:
(autoload 'org-cdlatex-mode "org" "cdlatex mode from org.")
(with-eval-after-load "latex"
(add-hook 'TeX-mode-hook 'org-cdlatex-mode))
O potresti proprio require
org
come a sua volta tirerebbecdlatex
E, onestamente, il defun personale non avrà molta importanza per il tempo di init per la maggior parte del tempo. Le 1150 linee di defuns personali (84 defuns) nel mio init.el
aggiungono 0.02s su Emacs alla vaniglia.
Misurazione del tempo di inizializzazione
Un modo semplice per approssimare il tempo di inizializzazione è
time emacs --eval "(kill-emacs)"
(benchmark contro emacs -q
.
Ma per avere un'approssimazione più dettagliata di dove sono i colli di bottiglia di inizializzazione, dai un'occhiata a Joe Schafer esup
.
Infine, il tempo di caricamento non scompare magicamente. Lo stai solo spingendo in avanti (nella misura in cui usi tutte le funzionalità in ogni sessione).
with-eval-after-load
viene caricato una volta , quindi un cambiamento di keymap va lì. Gli hook vengono caricati ogni volta che viene eseguita la modalità , ad es. Al caricamento di un nuovo file associato alla modalità o comunque viene definito l'hook. Carichi ad es.flyspell-mode
Ohl-line-mode
con un gancio. Nel mioinit.el
usowith-eval-after-load
circa 160 volte eadd-hook
110 volte. Un init pigro è un buon init (IMO).