Ein fauler Init ist ein guter Init.
(IMO)
Wann zu verwenden with-eval-after-load
with-eval-after-load
geladen wird einmal , wenn eine bestimmte Funktion oder Datei wird zuerst geladen wird , so eindeutig ein keymap Wechsel innerhalb eines davon geht. Nicht zuletzt, weil die Keymap zur Init-Zeit möglicherweise nicht bekannt ist [versuchen Sie etwas wie (define-key message-mode-map (kbd "C-c f") 'Footnote-add-footnote)
in emacs -q
]. Ein Hook ist hier keine gute Lösung, da er die Funktion bei jedem Start des Hooks an eine Taste bindet . Wie tarsius Notizen können Sie mehr lesen , warum nicht an local-set-key
Haken.
Schließlich ist zu beachten , dass with-eval-after-load
das GNU Emacs 24.4 ist ein 2 - zeiliges Wrapper um , eval-after-load
wo body
nicht in Anführungszeichen gesetzt werden muß.
Wann benutzt man Haken?
Hooks sind Listen von Funktionen, die jedes Mal geladen werden, wenn ein Kriterium erfüllt wird, z. B. wenn ein bestimmter Modus gestartet wird. Hooks werden häufig zum Laden von Nebenmodi wie flyspell-mode
oder verwendet hl-line-mode
. ZB (add-hook 'org-agenda-mode-hook 'hl-line-mode)
. Wie Rémi betont, add-hooks
ist er schlau und wird das Richtige tun, auch wenn die Hook-Variable noch nicht geladen wurde. Trotzdem habe ich viele Klauseln wie die folgenden, die für Geschwindigkeitszuwächse vernachlässigbar sind, aber ein Gefühl für Organisation und Abhängigkeitsstruktur vermitteln:
(with-eval-after-load 'org-agenda
(add-hook 'org-agenda-mode-hook 'hl-line-mode))
Warum nachhaken org-agenda
? Wie immer C-h v org-agenda-mode-hook C-j
liefert. Der Haken ist definiert in , org-agenda.el
wie gezeigt in *help*
.
Zusätzliche Funktionen werden geladen with-eval-after-load
with-eval-after-load
ist auch wichtig, um zusätzliche Funktionen zu laden. Wahrscheinlich möchten Sie so etwas wie (with-eval-after-load 'org (require 'org-inlinetask))
org-Inlinetasks laden. Um zu sehen warum (find-library "org-inlinetask")
. Da org-inlinetasks.el
direkt (require 'org)
alle netten autoload
, die Ihre freundlichen Emacs-Betreuer mit großer Sorgfalt erstellt haben, werden "ignoriert" und alle org.el(c)
geladen.
Was aber, wenn Ihr (persönlicher) Platz defun
benötigt? Wenn Sie wirklich wählerisch sind, können Sie das defun
s in eine andere Datei einfügen load-path
und autoload
Cookies hinzufügen , oder Sie können Emacs mitteilen, wo die Funktion mit der autoload
Funktion zu finden ist. Dann würde so etwas funktionieren:
(autoload 'org-cdlatex-mode "org" "cdlatex mode from org.")
(with-eval-after-load "latex"
(add-hook 'TeX-mode-hook 'org-cdlatex-mode))
Oder man könnte genauso require
org
wie es seinerseits ziehen würdecdlatex
Und ehrlich gesagt, für die Init-Zeit wird der persönliche Defun die meiste Zeit keine Rolle spielen. Die 1150 Zeilen von persönlichen Defuns (84 Defuns) in meinem init.el
addieren 0.02s gegenüber Vanille-Emacs.
Initialisierungszeit messen
Eine einfache Methode zur Abschätzung der Initialisierungszeit ist
time emacs --eval "(kill-emacs)"
(Benchmark gegen emacs -q
.
Um eine detailliertere Abschätzung der Initialisierungsengpässe zu erhalten, schauen Sie sich Joe Schafers an esup
.
Schließlich verschwindet die Ladezeit nicht auf magische Weise. Sie treiben es nur voran (sofern Sie alle Funktionen in jeder Sitzung verwenden).
with-eval-after-load
Wird einmal geladen , so geht ein Keymap-Wechsel dahin. Hooks werden jedes Mal geladen, wenn der Modus ausgeführt wird , z. B. beim Laden einer neuen Datei, die dem Modus zugeordnet ist, oder wenn der Hook definiert ist. Sie würden zBflyspell-mode
oderhl-line-mode
in einen Haken laden . In meinem verwendeinit.el
ichwith-eval-after-load
ungefähr 160 mal undadd-hook
110 mal. Ein Lazy Init ist ein guter Init (IMO).