Da es bei init mehr zu tun gibt, als nur eine Datei zu laden und andererseits meine Laufzeitumgebung zu verknüpfen .emacs.d
oder zu ändern HOME
, habe ich mich für eine Variante von @glucas entschieden. Ich habe den Code von verwendet startup.el
und den Patch von # 15539 hinzugefügt , um eine Umgebungsvariable zum Wechseln zwischen verschiedenen Init-Verzeichnissen zu verwenden. Wenn keine angegeben ist, wird die Standardeinstellung verwendet.
Es gab ein Problem mit Spacemacs: Sie async
wissen nichts über das geänderte Init-Verzeichnis und können daher einige erforderliche Dateien nicht finden. Aber dies wurde kürzlich in Spacemacs behoben: Fehler beim Verwenden eines anderen Konfigurationsverzeichnisses als .emacs.d · Problem # 3390
Also hier ist meine ~/.emacs
, die sich wie der ursprüngliche Init-Code verhalten sollte, aber mit konfigurierbarem Init-Verzeichnis:
;;; .emacs --- let the user choose the emacs environment to use
;;; Commentary:
;;; This code mimics the behaviour of `startup.el' to let the
;;; usage of the custom init directory behave just like the
;;; one and only "~/.emacs.d".
;;;
;;; By setting the environment variable `EMACS_USER_DIRECTORY'
;;; the user-emacs-directory can be chosen and if there is an
;;; `init.el' the configuration from that directory will be used.
;;; If the environment variable is not set or there is no `init.el'
;;; the default configuration directory `~/.emacs.d/' will be used.
;;;
;;; The variable `server-name' will be set to the name of the directory
;;; chosen as start path. So if the server will be started, it can be
;;; reached with 'emacsclient -s servername'.
;;;
;;; This now works with a current version of spacemacs but does not
;;; work with `async-start' in general, if the code executed with `async'
;;; uses `user-init-dir' or makes other assumptions about the emacs
;;; start-directory.
;;; Code:
(let* ((user-init-dir-default
(file-name-as-directory (concat "~" init-file-user "/.emacs.d")))
(user-init-dir
(file-name-as-directory (or (getenv "EMACS_USER_DIRECTORY")
user-init-dir-default)))
(user-init-file-1
(expand-file-name "init" user-init-dir)))
(setq user-emacs-directory user-init-dir)
(with-eval-after-load "server"
(setq server-name
(let ((server--name (file-name-nondirectory
(directory-file-name user-emacs-directory))))
(if (equal server--name ".emacs.d")
"server"
server--name))))
(setq user-init-file t)
(load user-init-file-1 t t)
(when (eq user-init-file t)
(setq user-emacs-directory user-init-dir-default)
(load (expand-file-name "init" user-init-dir-default) t t)))
(provide '.emacs)
;;; .emacs ends here
Es gibt auch eine nette Ergänzung, mit der es ohne zusätzlichen Aufwand als Daemon funktioniert: Der Servername wird auf den Namen des Init-Verzeichnisses gesetzt. Jetzt können Sie einen zweiten Emacs-Daemon mit Vanille-Spacemacs starten
EMACS_USER_DIRECTORY=~/.emacsenv.d/spacemacs emacs --daemon
und benutze immer noch emacsclient
emacsclient -s spacemacs -c -e '(message "Hello spacemacs")'
Mein Anwendungsfall ist sehr einfach und ich bin erstaunt, dass ich der einzige bin: Ich habe einen immer laufenden Emacs-Daemon und benutze ihn von der GUI und über die Konsole (zum Beispiel mit SSH). In diesem Emacs bereite ich alle meine Unterlagen und mein Arbeitsprotokoll vor, also muss es die ganze Zeit da sein. Aber dann möchte ich Spacemacs oder eines der anderen Distributionspakete ausprobieren und sogar konfigurieren, bis ich meine aktuelle Konfiguration zurückziehen oder einige der cleveren Ideen verwenden kann. Und wie andere wollte ich eine einfache Basiskonfiguration für meine Mitarbeiter erstellen - und in meiner laufenden Instanz mit org-mode dokumentieren.
Da das einzige mir bekannte Problem darin besteht, async
dass es nichts über das geänderte Init-Verzeichnis weiß, überlege ich, wie man am besten eine Konfiguration mit async
Variablen hinzufügt, die standardmäßig eingefügt werden sollten, damit nicht alle gepatcht werden müssen Beschwörungen async-start
wie bei Spacemacs.