Ich arbeite an einer benutzerdefinierten und kleinen Emacs-Konfiguration, die ich als Git-Repository für einige Freunde freigeben möchte, damit diese sie als Basis für ihre eigenen zukünftigen Konfigurationen verwenden können.
Dafür brauche ich eine Möglichkeit, meine Konfiguration zu testen. Die einfachste Lösung, die ich finden kann, ist etwa:
$ emacs --eval "(setq user-emacs-directory \"~/Code/my_custom_emacs.d/\")"
Aber ich kann es scheinbar nicht zum Laufen bringen.
Jede Hilfe sehr geschätzt.
.emacs.d
Verzeichnis gefunden, es sei denn, Sie ändern HOME, was mir problematisch erscheint. Die Leute haben im Folgenden Problemumgehungen bereitgestellt, aber für mich klingt dies nach einer sehr vernünftigen Feature-Anfrage für Emacs.wontfix
und im Bug-Tracker geschlossen.Antworten:
Der grundlegende Ansatz, den ich dafür verwende, besteht darin, Folgendes zu ändern
$HOME
:Sie verwenden dann
/path/to/dir/.emacs.d
Möglicherweise möchten Sie auch alle Dateien oder Verzeichnisse, die in diesem falschen Verzeichnis von Bedeutung sind, mit den echten verknüpfen, damit Emacs sie sehen kann.
quelle
Die Art und Weise, wie ich mehrere
.emacs.d
Verzeichnisse parallel pflege, ist die folgende.emacs wird so gestartet:
Jede
init.el
Datei beginnt wie folgt, um die Variablenuser-init-file
und korrekt einzurichtenuser-emacs-directory
:Ich habe festgestellt, dass dies in den letzten Monaten sehr zuverlässig funktioniert. Hier einige Anmerkungen:
Es bricht ab
emacs-init-time
und gibt nur die Zeit an, die zum Laden der Standardsystemkonfiguration benötigt wird, nicht jedoch Ihre eigene Init-Datei. Wenn Sie daran interessiert sind, Ihre Init-Zeit zu messen , müssen Sie dies auf eine andere Weise tun (siehe zum Beispiel Wie messe ich die Leistung von Elisp-Code? ).Es ist nicht gleichbedeutend mit einem normalen Start und Sie müssen sich um einige bestimmte Punkte kümmern. Speziell:
after-init-hook
wird ausgeführt, bevor die Init-Datei geladen wird.*scratch*
Puffer wird erstellt, bevor die Init-Datei geladen wird. Sie müssen den Modus explizit ändern (anstatt zu verwendeninitial-major-mode
).package-initialize
; es wird nicht automatisch gemachtder Weg zu
init.el
kann beliebig gewählt werden; Insbesondere muss das Verzeichnis, in dem sichinit.el
befindet, nicht benannt werden.emacs.d
. Ich benutze dies zum Beispiel habe.emacs.d.23
neben.emacs.d.24
um zwischen verschiedenen Versionen von Emacs umschalten zu können (das System mir bei der Arbeit ist leidlich veraltet, und ich kann nicht Emacs 24 auf allen Rechnern installiere ich verwende).Dieser Workflow erfordert keine Änderung der Umgebung (und insbesondere der
HOME
envvar). Dies kann wünschenswert sein, wenn Sie Programme in Emacs ausführen, die von der geänderten Umgebung betroffen sein könnten.quelle
--load
ed-Datei als Init-Datei betrachten. Für den Anfang sieht es für mich so aus, als würde keine normale (Standard-) Paketinitialisierung stattfinden, und sieafter-init-hook
wird ausgeführt, bevor die (gefälschte) Init-Datei ausgewertet wird. Dies sind Dinge, die Sie sicherlich umgehen können, aber beachten Sie, dass es nicht genau dasselbe ist wie Emacs, das den angegebenen Pfad als Init-Datei verwendet.after-init-hook
. Aber ich muss sagen, dass ich, obwohl ich diese Technik die ganze Zeit benutze, nie auf Probleme gestoßen binafter-init-hook
(aber ich benutze sie nicht explizit und vielleicht bin ich nur glücklich, dass die Pakete, die ich benutze, nicht darauf angewiesen sind). . Was meinen Sie mit "normale (Standard-) Paketinitialisierung wird nicht stattfinden"?command-line
wirdpackage-initialize
in dieser Situation nicht klappen . Sie müssten es manuell in der Fake-Init-Datei aufrufen.Du kannst symlinken
~/.emacs.d
, das ist was ich tueVersuchen Sie, meine emacs-Konfiguration so zu gestalten, dass
~/.emacs.d
sich alle emacs-bezogenen Konfigurationsdateien in diesem Ordner befindenDann habe ich einen
~/.emacs_configs
Ordner, in dem alle Konfigurationsordner (im Grunde genommen ein Ordner mit einerinit.el
und der restlichen Konfiguration) liegen, so dass sich mein persönlicher Konfigurationsordner befindet~/emacs_configs/iqbal
, in dem sich eine Präludiumsdistribution befindet~/emacs_configs/prelude
Sehr früh in meiner persönlichen Emacs-Konfiguration habe ich
user-emacs-directory
den vollständigen Pfad zu meiner Konfiguration wie folgt festgelegtDann symlinke ich schließlich
~/.emacs.d
zu der Konfiguration, die ich tatsächlich verwenden möchte, z. Um meine Konfiguration zu verwenden, werde ich tunln -s ~/emacs_configs/iqbal .emacs.d
. Wenn Sie eine Konfiguration ausprobieren möchten, kopieren Sie den Konfigurationsordner in~/emacs_configs/whatever_name
und ändern Sie den SymlinkDer Vorteil des dritten Schritts ist, dass Emacs, die mit meiner persönlichen Konfiguration gestartet wurden, unbeeinträchtigt ausgeführt werden können, auch wenn ich den
.emacs.d
Symlink ändere, während Emacs ausgeführt wird.Ein weiterer Vorteil ist, dass die
HOME
nicht geänderten externen Programme, mit denen Emacs möglicherweise interagieren müssen, nicht betroffen sindquelle
(setq user-emacs-directory (file-truename "~/.emacs.d/"))
so anpassen können, dass sie alle gleichzeitig ohne Auswirkungen ausgeführt werden können?~/.emacs.d
anstatt ihn zu verwendenuser-emacs-directory
. Ich bin mindestens einer solchen Bibliothek begegnet, kann mich aber leider nicht an den Namen erinnern.Eine Konfiguration, die sich nicht ändert
HOME
oder mit Symlinks funktioniert, finden Sie in meiner Antwort https://emacs.stackexchange.com/a/20508/934 . Mit dieser Konfiguration können Sie Folgendes ändern,user-emacs-directory
indem Sie eine Umgebungsvariable festlegen:und das funktioniert sogar mit dem daemon.
quelle
Ich habe diese saubere Lösung von EmacsWiki gefunden :
(Nicht unbedingt ein benutzerdefiniertes Verzeichnis verwenden, funktioniert aber gut, da Sie wahrscheinlich sowieso nur eine einzige Eintragsdatei haben.)
quelle
Der Patch, mit dem Sie den Speicherort von .emacs.d über die Umgebungsvariable EMACS_USER_DIRECTORY angeben können, ist unter https://debbugs.gnu.org/cgi/bugreport.cgi?bug=15539 verfügbar, wurde jedoch noch nicht zusammengeführt.
quelle
Stellen Sie Ihre Variable ein, bevor Sie Ihre Init-Datei laden:
Dann, in Ihrer Init-Datei (in diesem Fall
~/.emacs
):quelle
Um die Antwort von @phils zu erweitern, habe ich dieses kleine Shell-Skript (genannt
testrun.sh
) erstellt, um meine neue emacs-Konfiguration zu testen. Dies kann auch in anderen Fällen sinnvoll sein (zum Beispiel beim Testen von Änderungen an Ihrem init.el, die Emacs beschädigen könnten).quelle
Hier ist ein kleines Skript, das auf der Antwort und dem Kommentar von @ Phil zum Ändern der
HOME
Umgebungsvariablen und zum anschließenden Wiederherstellen in Emacs basiert .quelle
Wenn der Anwendungsfall einzelne Emacs - Konfiguration „.emacs.d“ Verzeichnis für alle Benutzer eines Linux - Rechner teilen dann diese Lösung https://emacs.stackexchange.com/a/4258/5488 würde in den meisten Fällen funktionieren, aber in einigen In einigen Fällen versucht emacs, temporäre Dateien in das user-emacs-Verzeichnis zu schreiben (z. B. die Datei .ido.last). In solchen Fällen funktioniert das freigegebene Konfigurationsverzeichnis mit Schreibberechtigung für alle Benutzer, ist jedoch möglicherweise nicht die gewünschte Lösung, da möglicherweise nicht jeder Systembenutzer dasselbe Verzeichnis zum Speichern von temporären Dateien verwenden möchte. In diesem Fall ist die folgende Lösung die bessere Option.
Die gemeinsame Konfigurationsdatei .emacs.d / init.el sollte mit beginnen
Stellen Sie sicher, dass die freigegebene Konfigurationsdatei .emacs.d Leseberechtigung für alle Benutzer hat (Schreibberechtigungen sind nicht erforderlich).
Jeder Benutzer hat sein eigenes "~ / .emacs.d /" - Verzeichnis, das jedoch nur zum Speichern der temporären Dateien verwendet wird. Die Pakete und andere Konfigurationsdateien werden jedoch aus dem freigegebenen Konfigurationsverzeichnis geladen.
quelle