Ich möchte dem Latex-Modus eine bestimmte Schlüsselbindung hinzufügen:
(define-key latex-mode-map (kbd "<f6>") 'my-latex-defun)
Gleichzeitig möchte ich es nur einstellen, wenn der bestimmte Modus geladen ist. Daher würde ich gerne wissen, ob es eine Vorliebe (Best Practice) gibt, den entsprechenden Hook ( latex-mode-hook
) zu verwenden, um dies zu erreichen, oder die Klausel (with-eval-after-load "tex-mode" ...
zum Umbrechen der Schlüsselbindungsdefinition zu verwenden. Ich habe beide getestet und sie funktionieren einwandfrei, aber ich frage mich, welcher Weg der richtige ist.
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).Antworten:
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)
inemacs -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 anlocal-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
wobody
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 verwendethl-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:Warum nachhaken
org-agenda
? Wie immerC-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")
. Daorg-inlinetasks.el
direkt(require 'org)
alle nettenautoload
, die Ihre freundlichen Emacs-Betreuer mit großer Sorgfalt erstellt haben, werden "ignoriert" und alleorg.el(c)
geladen.Was aber, wenn Ihr (persönlicher) Platz
defun
benötigt? Wenn Sie wirklich wählerisch sind, können Sie dasdefun
s in eine andere Datei einfügenload-path
undautoload
Cookies hinzufügen , oder Sie können Emacs mitteilen, wo die Funktion mit derautoload
Funktion zu finden ist. Dann würde so etwas funktionieren: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
(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).
quelle
with-eval-after-load
ohne die faulen Initialisierungsvorteile zu verlieren?eval-after-load
Lassen Sie mich zusätzlich zu Ihren Vorschlägen und der Verwendung eines Hakens Folgendes vorschlagenuse-package.el
. Sie können tun, was Sie brauchenLaTeX wird erst nach Aufforderung geladen .
Nur als Randnotiz: Durch sorgfältige Verwendung von konnte
use-package
ich meine Startzeiten auf unter eine Sekunde verkürzen. (Früher dauerte es ungefähr vier Sekunden.)quelle
use-package
mit Emacs 25 ausgeliefert wird.