Leniwy inicjator jest dobrym inicjatorem.
(IMO)
Kiedy użyć with-eval-after-load
with-eval-after-load
jest ładowany raz, gdy pewna funkcja lub plik jest ładowany po raz pierwszy , więc zmiana mapy klawiszy wyraźnie wchodzi w jeden z nich. Nie tylko dlatego, że mapa klawiszy może nie być znana podczas inicjalizacji [spróbuj czegoś takiego jak (define-key message-mode-map (kbd "C-c f") 'Footnote-add-footnote)
w emacs -q
]. Hak nie jest tutaj dobrym rozwiązaniem, ponieważ wiąże funkcję z klawiszem przy każdym uruchomieniu haka. Jak Tarsius notatek, można dowiedzieć się więcej o tym, dlaczego nie do local-set-key
w haki.
Na koniec zauważ, że with-eval-after-load
GNU Emacs 24.4 jest 2-liniowym opakowaniem, w eval-after-load
którym body
nie trzeba cytować.
Kiedy stosować haki
Haki to lista funkcji ładowanych za każdym razem, gdy spełnione jest kryterium, np. Uruchamiany jest określony tryb. Powszechnym zastosowaniem haków jest ładowanie mniejszych trybów, takich jak flyspell-mode
lub hl-line-mode
. Np (add-hook 'org-agenda-mode-hook 'hl-line-mode)
. Jak podkreśla Rémi , add-hooks
jest sprytny i zrobi właściwą rzecz, nawet jeśli zmienna haka nie została jeszcze załadowana. Niemniej jednak mam wiele klauzul, takich jak następujące, które mogą być nieistotne dla przyspieszenia, ale dają poczucie organizacji i struktury zależności:
(with-eval-after-load 'org-agenda
(add-hook 'org-agenda-mode-hook 'hl-line-mode))
Po co dodawać do haka po org-agenda
? Jak zawsze C-h v org-agenda-mode-hook C-j
dostarcza. Hak jest zdefiniowany org-agenda.el
jak pokazano w *help*
.
Ładowanie dodatkowych funkcji with-eval-after-load
with-eval-after-load
jest również ważne przy ładowaniu dodatkowych funkcji. Prawdopodobnie chcesz coś takiego jak (with-eval-after-load 'org (require 'org-inlinetask))
ładowanie orglinaskasks. Aby zobaczyć dlaczego (find-library "org-inlinetask")
. Ponieważ org-inlinetasks.el
bezpośrednio (require 'org)
wszystkie miłe autoload
rzeczy, o które dbali Twoi przyjaźni opiekunowie Emacsa, zostaną „zignorowane” i wszystkie org.el(c)
zostaną załadowane.
Ale co jeśli twoje (osobiste) defun
jest wymagane kilka miejsc? Jeśli jesteś naprawdę wybredny, możesz umieścić defun
s w innym pliku w swoim pliku load-path
i dodać autoload
pliki cookie lub możesz powiedzieć Emacsowi, gdzie znaleźć funkcję za pomocą tej autoload
funkcji. Wtedy coś takiego działałoby:
(autoload 'org-cdlatex-mode "org" "cdlatex mode from org.")
(with-eval-after-load "latex"
(add-hook 'TeX-mode-hook 'org-cdlatex-mode))
Lub możesz tak, require
org
jak to z kolei pociągniecdlatex
I, szczerze mówiąc, osobisty defun nie będzie miał większego znaczenia dla czasu inicjacji przez większość czasu. 1150 linii osobistej porażki (84 porażek) u mnie init.el
dodaje 0,02s w stosunku do waniliowego Emacsa.
Pomiar czasu inicjalizacji
Prostym sposobem na przybliżenie czasu inicjalizacji jest
time emacs --eval "(kill-emacs)"
(punkt odniesienia przeciwko emacs -q
.
Ale aby uzyskać bardziej szczegółowe przybliżenie, gdzie są wąskie gardła podczas inicjalizacji, sprawdź Joe Schafer esup
.
Wreszcie czas ładowania nie znika magicznie. Popychasz go tylko do przodu (do tego stopnia, że używasz wszystkich funkcji w każdej sesji).
with-eval-after-load
jest ładowany jeden raz , więc następuje zmiana mapy klawiszy. Haki ładują się przy każdym uruchomieniu trybu , np. Przy ładowaniu nowego pliku związanego z trybem lub niezależnie od tego, jak hak jest zdefiniowany. Załadowałbyś np.flyspell-mode
Lubhl-line-mode
hak. W moiminit.el
używamwith-eval-after-load
około 160 razy iadd-hook
110 razy. Leniwy init jest dobrym inicjatorem (IMO).