Karena ada lebih banyak yang harus dilakukan di init daripada hanya memuat file dan di sisi lain symlinking .emacs.d
atau mengubah HOME
perubahan lingkungan runtime saya, saya memilih varian dari apa yang telah diusulkan @glucas. Saya menggunakan kode dari startup.el
dan menambahkan tambalan dari # 15539 untuk menggunakan variabel lingkungan untuk beralih antara dir init yang berbeda. Jika tidak ada yang diberikan, default digunakan.
Ada satu masalah dengan spacemacs: async
tidak tahu tentang direktori init yang diubah sehingga tidak dapat menemukan beberapa file yang diperlukan. Tapi ini telah diselesaikan di spacemacs baru-baru ini: Kesalahan saat menggunakan direktori config selain .emacs.d · Masalah # 3390
Jadi inilah saya ~/.emacs
yang harus berperilaku seperti init-code asli tetapi dengan direktori init yang dapat dikonfigurasi:
;;; .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
Ada juga tambahan yang bagus yang membuatnya berfungsi sebagai daemon tanpa usaha ekstra: nama server akan ditetapkan ke nama direktori init. Jadi sekarang Anda dapat memulai daemon emacs kedua dengan vanilla spacemacs
EMACS_USER_DIRECTORY=~/.emacsenv.d/spacemacs emacs --daemon
dan masih menggunakan emacsclient
emacsclient -s spacemacs -c -e '(message "Hello spacemacs")'
Penggunaan saya sangat sederhana dan saya heran, bahwa saya adalah satu-satunya: Saya memiliki daemon emacs yang selalu berjalan dan menggunakannya dari gui dan konsol (dengan ssh misalnya). Dalam emacs ini saya menyiapkan semua dokumentasi dan log kerja saya, jadi harus selalu ada di sana. Tetapi kemudian saya ingin mencoba spacemacs atau salah satu paket distribusi lainnya dan bahkan mengkonfigurasinya, hingga saya dapat menghentikan konfigurasi saya saat ini atau menggunakan beberapa ide pintar. Dan seperti yang lain, saya ingin membuat konfigurasi basis sederhana untuk rekan kerja saya - dan mendokumentasikannya dengan mode-org dalam menjalankan contoh saya.
Karena satu-satunya masalah yang saya tahu adalah async
dan tidak tahu tentang dir init yang diubah, saya berpikir tentang cara terbaik untuk menambahkan beberapa konfigurasi ke async
yang memiliki variabel yang harus disuntikkan secara default, sehingga tidak perlu menambal semua doa async-start
seperti yang dilakukan ruang angkasa.