Wie jeder Emacs'er wissen wird, leide ich derzeit unter meiner umfangreichen Dot-Emacs-Konfiguration. Alle meine Pakete befinden sich in den Containern von use-package
, und ich habe alle meine .el
-Dateien bytekompiliert. Trotzdem startet Emacs in 6,4 Sekunden und lädt anschließend den Rest der Pakete (etwa 40 davon).
Ich dachte über andere Wege nach, um die lange Startzeit zu lösen, dann bemerkte ich etwas. Der Standard-Emacs (ohne Benutzerkonfiguration) verwendet viele .el
Bibliotheken, die in jedem Emacs enthalten sind. Sie befinden sich in \shares\emacs\version number\lisp\
.
Selbst mit vielen Lisp-Dateien kann es in einer Sekunde gestartet werden. Als ich die Dateien vieler Pakete inspizierte, die in den Standard-Emacs enthalten sind, fand ich nichts Außergewöhnliches, das erklären könnte, warum Emacs innerhalb einer Sekunde gestartet werden kann. Kann mir jemand sagen, wie Emacs das schafft, selbst mit Tausenden von .el
Dateien?
:defer t
in Ihrenuse-package
Erklärungen, wo immer dies möglich ist?C-h i g (elisp) Building Emacs
Antworten:
Emacs "verwaltet" dies, indem es beim Start nicht geladen wird, wodurch das Laden der Kernanwendung nicht aufgehalten wird. Dies wiederum als Folge einer schnelleren Rückgabe der Tastatursteuerung an den Benutzer.
Aber wann wird es geladen? Bei der ersten Verwendung dieser Funktion, dieses Modus oder dieser Funktion.
Verlangsamt es nicht? Ja, beim ersten Gebrauch. Das ist der Kompromiss. Möchten Sie beim Start von emacs oder beim ersten Gebrauch langsamer fahren?
Ist es auffällig? Das Laden zum Startzeitpunkt scheint länger zu dauern, da auch andere Kernbibliotheken geladen werden. Beim ersten Gebrauch fühlt es sich jedoch schneller an, da nur diese Teilmengenfunktion geladen wird.
Warum sollte dann jemand beim Start die Last auswählen? Da es einigen nichts ausmacht, beim Start darauf zu warten, alle häufig verwendeten Bibliotheken zu laden, werden alle Vorgänge nach dem Laden schnell ausgeführt.
Wie kann ich wählen? Wie Drew und andere in ihren Antworten auf genau diese Frage hervorgehoben haben, können Sie Autoload und ähnliche Tricks zur Steuerung verwenden. Die wichtigste Überlegung sollte jedoch Ihr Nutzungsmuster sein. Wenn Sie Emacs wie vi verwenden, die sich ständig öffnen und schließen, wird die Startzeit schmerzhaft offensichtlich. Wenn Sie jedoch Emacs verwenden, die ständig ausgeführt werden, ist eine Startzeit von 1 Sekunde oder 1 Minute nicht so auffällig oder wichtig genug, um sich darum zu kümmern.
Beachten Sie, dass Sie den Batch-Modus oder Zile für den sofortigen Start verwenden können, während Sie Emacs wie vi testen, ausführen oder auf andere Weise verwenden.
Ich bevorzuge es, beim Start zu laden, damit Fehler im Voraus erkannt werden. Ich bevorzuge es, mich während eines Arbeitstages nicht mit Ladefehlern befassen zu müssen, wenn unzählige Puffer, Modi und Kompilierungszustände zusammen mit mehreren von TRAMP verwalteten Remote-Standorten aktiv sind. Das Debuggen von Autoload-Fehlern unter solchen Bedingungen ist nicht sehr angenehm.
quelle
Viele der enthaltenen Bibliotheken werden beim Start nicht geladen.
Einige Befehle usw. werden automatisch geladen , was bedeutet, dass Emacs sie erkennt und weiß, wie sie geladen werden. Wenn Sie versuchen, einen Befehl zu verwenden, der automatisch geladen wird, lädt Emacs die Bibliothek, die ihn definiert, falls er noch nicht geladen wurde.
Sie können Ihre eigenen Autoloads erstellen, unabhängig davon, ob Sie eigene Befehle oder Befehle in Bibliotheken haben, die Sie nicht geschrieben haben. Siehe das Elisp-Handbuch, Knoten Autoload .
quelle
;;;###autoload
) unmittelbar vor einer Befehlsdefinition in Ihrer Bibliothek ist eine Möglichkeit, eine Autoload-Definition zu erstellen, um sicherzustellen, dass die Bibliothek geladen wird, wenn jemand sie aufruft.(autoload...)
direkt in Ihrer Init-Datei aufrufen , um sie zu registrieren.Zusätzlich zu den anderen Antworten (die erklären , wie die Mehrheit der Bibliotheken sind eigentlich nur bei Bedarf geladen), gibt es auch die Frage der Vorbelastung von vielen Kern elisp Bibliotheken innerhalb der
emacs
ausführbaren Datei selbst, die eine Illusion von ihm einen Laden bietet viele Dinge unglaublich schnell.Dies wird erreicht , indem Sie eine sogenannte „nackte“ Version von Emacs (das ist das, was tatsächlich kompiliert wurde, und das ist voll funktionsfähig, enthält aber nur die elisp Interpreter und andere Kernfunktionen in C geschrieben), und zu sagen , dass zu Last Alle Elisp-Bibliotheken, die vorinstalliert werden sollten, bevor die eigentliche
emacs
Binärdatei mit den eingebauten Bibliotheken endgültig "ausgegeben" wird .Dieser Mechanismus ist im elisp-Handbuch beschrieben:
C-hig
(elisp) Building Emacs
RETWenn Sie Emacs selbst kompiliert haben, können Sie mit diesem Prozess experimentieren und auf Wunsch sogar alternative Versionen der endgültigen ausführbaren Datei sichern (nicht allgemein empfohlen, aber die Funktion ist vorhanden).
Die kompilierte
temacs
Binärdatei befindet sich imsrc
Verzeichnis, und Sie können den Unterschied in den Startzeiten vergleichen, indem Sie jede Version wie folgt ausführen:Auf meinem System dauert Ersteres ~ 4 Sekunden (währenddessen 111 Elisp-Bibliotheken geladen werden), während Letzteres ~ 0,02 Sekunden dauert.
quelle