ファイルをロードするだけでなく、実行時環境をシンボリックリンク.emacs.d
または変更HOME
するだけでなくinitで行うこともあるため、@ glucasが提案したもののバリアントを選択しました。異なる初期化ディレクトリ間の切り替えに環境変数を使用するために、#15539のコードを使用し、#15539startup.el
のパッチを追加しました。何も指定しない場合、デフォルトが使用されます。
spacemacsには1つの問題がありましasync
た。変更されたinitディレクトリを知らないため、必要なファイルが見つかりません。しかし、これは最近spacemacsで解決されました:.emacs.d 以外の設定ディレクトリを使用するときのエラー・問題#3390
だから、ここに~/.emacs
元のinitコードのように動作するはずですが、設定可能なinitディレクトリがあります:
;;; .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
追加の努力なしにデーモンとして動作する素晴らしい追加もあります:server-nameはinitディレクトリの名前に設定されます。だから今、あなたはバニラspacemacsで2番目のemacsデーモンを起動することができます
EMACS_USER_DIRECTORY=~/.emacsenv.d/spacemacs emacs --daemon
まだemacsclientを使用します
emacsclient -s spacemacs -c -e '(message "Hello spacemacs")'
私のユースケースは非常にシンプルで、私は唯一のものであることに驚いています:私は常に実行中のemacsデーモンを持ち、それをguiやコンソールから(たとえばsshで)使用しています。このemacsでは、すべてのドキュメントと作業ログを準備するため、常にそこにある必要があります。しかし、その後、現在の構成を廃止するか、いくつかの巧妙なアイデアを使用できるようになるまで、spacemacsまたは他の配布パッケージのいずれかを試して、構成します。また、他の人と同様に、同僚用のシンプルな基本構成を作成し、実行中のインスタンスで組織モードで文書化したいと考えました。
私が知っている唯一の問題はasync
、変更されたinit dirを知らないことなasync
ので、デフォルトでインジェクトされるべき変数を持つ設定を追加する最良の方法を考えます。async-start
spacemacsが行ったのと同じように呼び出します。