Wie kompiliere ich alles in meinem Verzeichnis .emacs.d per Byte?

138

Ich habe mich für Emacs entschieden und es hat mir sehr gut gefallen. Jetzt verwende ich das Emacs Starter Kit , das bessere Standardeinstellungen und einige nette Anpassungen für die Standardinstallation von Emacs bietet.

Ich habe es ein wenig angepasst, fügte ein paar Sachen wie yasnippet , farb Themen , ungebunden , und andere Sachen. Ich habe ein Github-Repository eingerichtet, in dem ich alle Anpassungen aufbewahre, damit ich von mehreren Stellen aus darauf zugreifen kann oder falls etwas schief geht und ich mein Verzeichnis .emacs.d verliere.

All dies ist sehr schön, aber es gibt ein Problem: Das Laden von Emacs dauert ca. 1-2 Sekunden. AFAIK Ich kann einzelne .el-Dateien mit Mx-Byte-Kompilierungsdatei zu .elc kompilieren, und es funktioniert. Aber es gibt viele .el-Dateien, und ich frage mich, ob es eine Möglichkeit gibt, sie alle mit einem einfachen Befehl oder etwas anderem zu kompilieren, um das Laden von Emacs zu beschleunigen. Mein Emacs ist nicht immer geöffnet, und ich öffne und schließe es ziemlich häufig, insbesondere nachdem ich es als Standardeditor für den Bearbeitungsbefehl in Total Commander eingerichtet habe, um mich schneller daran zu gewöhnen (ja, Windows XP hier).

Meine Emacs-Version ist 22.3. Und ja, die Standardinstallation von Emacs ohne Anpassungen wird sofort gestartet.

Ich bin mir nicht sicher, welche Version beim Laden bevorzugt wird, die .el oder kompilierte .elc übrigens Oo

Gibt es also einen elisp-Befehl oder einen Emacs-Befehlszeilenschalter, mit dem Emacs alles im Verzeichnis .emacs.d bytekompiliert?

Mikka
quelle

Antworten:

208

C-u 0 M-x byte-recompile-directory

kompiliert alle .el-Dateien im Verzeichnis und in allen Unterverzeichnissen unten.

Der C-u 0Teil besteht darin, nicht nach jeder .el-Datei zu fragen, die kein .elc-Gegenstück hat.

Laurynas Biveinis
quelle
9
Und danach (sobald jeder einmal kompiliert wurde) verwenden Sie einfach denselben Befehl ohne den C-u 0(auch bekannt C-0als BTW). Dadurch werden nur die Quelldateien bytekompiliert, die aktueller sind als ihre bytekompilierten Versionen.
Drew
1
Ein kleiner Hinweis: Für mich hat das nicht funktioniert, bis ich alle entsprechenden «.elc» -Dateien entfernt habe. Es wurde nur so etwas wie "Fertig, 0 Dateien zusammengestellt, α-Dateien übersprungen" gesagt.
Hi-Angel
1
@ Hi-Angel Ich habe das gleiche Problem. Haben Sie eine Lösung gefunden?
Zhanxw
@zhanxw yep. Leider kompiliert der Befehl nur Dateien, die entweder geändert wurden oder kein Gegenstück «.elc» haben. Um also alles in einem Verzeichnis neu zu kompilieren, müssen Sie zuerst alle «.elc» -Dateien löschen.
Hi-Angel
2
Der interaktive Befehl macht ihn leider nicht verfügbar, aber wenn Sie die Funktion direkt aufrufen, können Sie das optionale Argument verwenden, FORCEum Dateien neu zu kompilieren, denen bereits ein ".elc" zugeordnet ist, auch wenn sie nicht älter als die Quelldatei sind:M-: (byte-recompile-directory "/the/directory/" 0 t)
jbm
44

Um bei jedem Start von Emacs automatisch alles zu kompilieren, was Byte kompiliert werden muss, füge ich nach meinen Änderungen Folgendes load-pathoben in meine .emacsDatei ein:

(byte-recompile-directory (expand-file-name "~/.emacs.d") 0)

Überraschenderweise verlängert sich meine Startzeit nicht wesentlich (es sei denn, etwas muss kompiliert werden).

Um meine Emacs zu beschleunigen, habe ich zuerst die langsamen Teile mit profile-dotemacs.el identifiziert und sie dann durch Autoloads ersetzt .

Richard Hansen
quelle
Die Dokumentation zum automatischen Laden wurde verschoben. Das und die Referenz profile-dotemacs.el sind genau das, was ich brauchte, als ich auf diese Seite stieß.
Digicrat
24

Mit dem --batchFlag können Sie über die Befehlszeile neu kompilieren.

Um alles neu zu kompilieren, tun Sie

emacs --batch --eval '(byte-recompile-directory "~/.emacs.d")'

oder um eine einzelne Datei wie aus einem Makefile neu zu kompilieren,

emacs --batch --eval '(byte-compile-file "your-elisp-file.el")'
Mike Samuel
quelle
5
Verwenden Sie stattdessen Batch-Byte-Compile .
npostavs
1
Könnten Sie, wie man es benutzt?
Nacho4d
8
@ nacho4d emacs -Q --batch -f batch-byte-compile *.el foo/*.el- es wiederholt sich jedoch nicht wie das Byte- Recompile -Verzeichnis .
Brian Burns
3
Sie möchten wahrscheinlich ein Argument hinzufügen, um die Neukompilierung zu erzwingen, z. emacs --batch --eval '(Byte-Neukompilierungsverzeichnis "~ / .emacs.d" 0)'
Ibrahim
17

Dies schwankt ein wenig von der Frage, aber um das Problem des langsamen Ladens zu lösen, können Sie die neue Daemon-Funktion in Emacs 23 verwenden.

"Wenn Sie viele Support-Pakete haben, kann der Start von emacs etwas langsam sein. Emacs 23 bringt jedoch emacs --daemon, mit dem Sie Emacs im Hintergrund starten können (z. B. wenn Sie sich anmelden). Sie können sofort ein Pop-up erstellen." Neue Emacs-Fenster (Frames) mit emacsclient einrichten. Natürlich könnten Sie in älteren Versionen bereits einen Emacs-Server haben, aber wenn Sie ihn im Hintergrund starten können, ist dies eine viel schönere Lösung. "

Von http://emacs-fu.blogspot.com/2009/07/emacs-23-is-very-near.html

mwilliams
quelle
Ich werde mir das auf jeden Fall ansehen. Danke dir!
Mikka
2
Wenn Sie Ihrem .bashrc (oder der Version Ihrer Shell) den Alias ​​emacs = 'emacsclient -nw -a "" -c' hinzufügen, wird zunächst versucht, eine Verbindung zu einem laufenden Daemon herzustellen, falls vorhanden, andernfalls wird einer gestartet und eine Verbindung hergestellt Sie.
Frederick
2

Für meine Verwendung von Spacemacs lautet der Befehl spacemacs/recompile-elpa. Der Befehl byte-recompile-directorykompiliert keine Datei.

Yu Shen
quelle
2
Verschiedene Dinge. ELPA / MELPA-Zeug hat Build-Methoden in seiner eigenen Archivhierarchie definiert. byte-recompile-directory versucht, alle .el-Dateien in einem benutzerdefinierten Verzeichnis zu kompilieren.
RichieHH