Comme il y a plus à faire sur init que le simple chargement d'un fichier et que, d'autre part, créer des liens symboliques .emacs.d
ou modifier les HOME
modifications de mon environnement d'exécution, j'ai opté pour une variante de ce que @glucas avait proposé. J'ai utilisé le code de startup.el
et ajouté le correctif de # 15539 pour utiliser une variable d'environnement permettant de basculer entre différents répertoires d'initialisation. Si aucun n'est donné, la valeur par défaut est utilisée.
Il y avait un problème avec spacemacs: async
ne sait pas à propos du répertoire init modifié et ne peut donc pas trouver certains fichiers nécessaires. Mais ceci a été résolu récemment dans spacemacs: Erreur lors de l’utilisation d’un répertoire de configuration autre que .emacs.d · Issue # 3390
Voici donc mon ~/.emacs
qui devrait se comporter comme le code init initial mais avec un répertoire init configurable:
;;; .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
Il y a aussi un ajout intéressant qui le fait fonctionner comme un démon sans effort supplémentaire: le nom du serveur sera défini sur le nom du répertoire init. Alors maintenant, vous pouvez démarrer un deuxième démon emacs avec un spacemacs vanille
EMACS_USER_DIRECTORY=~/.emacsenv.d/spacemacs emacs --daemon
et toujours utiliser emacsclient
emacsclient -s spacemacs -c -e '(message "Hello spacemacs")'
Mon cas d'utilisation est très simple et je suis stupéfait d'être le seul: j'ai un démon emacs qui tourne toujours et je l'utilise depuis gui et sur console (avec ssh par exemple). Dans cet Emacs, je prépare toute ma documentation et mon journal de travail, il doit donc être là tout le temps. Mais ensuite, je veux essayer spacemacs ou l'un des autres packages de distribution et même le configurer, jusqu'à ce que je puisse abandonner ma configuration actuelle ou utiliser certaines des idées intelligentes. Et comme d'autres, je voulais créer une configuration de base simple pour mes collègues - et la documenter avec org-mode dans mon instance en cours d'exécution.
Comme le seul problème que je connaisse est async
qu’il ne connait pas le répertoire d’initialisation modifié, je pense au meilleur moyen d’ajouter une configuration à des async
variables qui devraient être injectées par défaut, de sorte qu’il n’est pas nécessaire de corriger tous les correctifs. invocations d’ async-start
espace comme les astronautes.