由于在init上要做的不仅仅是加载文件,而且在运行时环境中进行符号链接.emacs.d
或更改HOME
更改,因此我选择了@glucas提出的变体。我使用了#15539的代码startup.el
并添加了补丁,以使用环境变量在不同的init目录之间进行切换。如果没有给出,则使用默认值。
spacemacs有一个问题: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
还有一个很不错的添加,使其可以作为守护程序工作而无需付出额外的努力:服务器名称将设置为init目录的名称。所以现在您可以使用香草spacemacs启动第二个emacs守护程序
EMACS_USER_DIRECTORY=~/.emacsenv.d/spacemacs emacs --daemon
仍然使用emacsclient
emacsclient -s spacemacs -c -e '(message "Hello spacemacs")'
我的用例非常简单,我很惊讶,我是唯一的一个:我有一个始终运行的emacs守护程序,可以在gui和控制台(例如ssh)上使用它。在此emacs中,我准备了所有文档和工作日志,因此它必须一直存在。但是,然后我想尝试一下spacemacs或其他分发软件包之一,甚至进行配置,直到我可以退出当前的配置或使用一些聪明的主意。和其他人一样,我想为我的同事创建一个简单的基本配置-并在运行的实例中使用org-mode对其进行记录。
由于我知道的唯一问题是async
它不知道更改后的init目录,因此,我考虑了向其中添加一些配置的最佳方法,async
该配置具有默认情况下应注入的变量,因此无需修补所有的调用async-start
,就像spacemacs做了。