파일을로드하는 것보다 init에 더 많은 일이 있고 다른 한편으로는 런타임 환경을 심볼릭 링크 .emacs.d
하거나 변경하는 HOME
것보다 @glucas가 제안한 변형을 선택했습니다. I은 코드를 사용 startup.el
로부터 패치를 추가 # 15539 다른 초기화 DIRS의 전환에 대한 환경 변수를 사용. 아무 것도 지정하지 않으면 기본값이 사용됩니다.
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
추가 노력없이 데몬으로 작동하게하는 멋진 추가 기능도 있습니다. server-name은 init 디렉토리의 이름으로 설정됩니다. 이제 바닐라 스페이스 맥으로 두 번째 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
스페이스 맥 과 마찬가지로 호출 .