Dato che c'è molto altro da fare su init oltre al semplice caricamento di un file e d'altra parte il collegamento simbolico .emacs.d
o la modifica dei HOME
cambiamenti nel mio ambiente di runtime, ho optato per una variante di quanto proposto da @glucas. Ho usato il codice da startup.el
e ho aggiunto la patch da # 15539 per usare una variabile d'ambiente per passare da una directory di init all'altra. Se non ne viene fornito nessuno, viene utilizzato il valore predefinito.
C'è stato un problema con spacemacs: async
non conosce la directory init cambiata e quindi non riesce a trovare alcuni file necessari. Ma questo è stato risolto di recente in spacemacs: errore durante l'utilizzo di una directory di configurazione diversa da .emacs.d · Problema # 3390
Quindi ecco il mio ~/.emacs
che dovrebbe comportarsi come il codice di inizializzazione originale ma con la directory init configurabile:
;;; .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
C'è anche una bella aggiunta che lo fa funzionare come demone senza ulteriore sforzo: il nome del server verrà impostato sul nome della directory init. Quindi ora puoi avviare un secondo demone emacs con un spacemacs alla vaniglia
EMACS_USER_DIRECTORY=~/.emacsenv.d/spacemacs emacs --daemon
e usa ancora emacsclient
emacsclient -s spacemacs -c -e '(message "Hello spacemacs")'
Il mio caso d'uso è molto semplice e mi stupisco di essere l'unico: ho un demone emacs sempre in esecuzione e lo uso dalla GUI e dalla console (con ssh per esempio). In questo emacs preparo tutta la mia documentazione e il registro di lavoro, quindi deve essere sempre presente. Ma poi voglio provare spacemacs o uno degli altri pacchetti di distribuzione e persino configurarlo, fino a quando posso ritirare la mia configurazione attuale o usare alcune delle idee intelligenti. E come altri, volevo creare una semplice configurazione di base per i miei colleghi e documentarla con la modalità org nella mia istanza corrente.
Poiché l'unico problema che conosco è async
e che non è a conoscenza della directory init cambiata, penso al modo migliore per aggiungere una configurazione a async
cui sono presenti variabili che dovrebbero essere iniettate per impostazione predefinita, quindi non è necessario applicare patch a tutto invocazioni async-start
proprio come avevano fatto i veicoli spaziali.