Sadece bir dosya yüklemek ve diğer yandan çalışma ortamımı .emacs.d
değiştirmek veya değiştirmekle uğraşmak yerine init'te yapılacak daha çok şey olduğu HOME
için, @glucas’nun önerdiği bir değişkeni seçtim. Farklı init dizinleri arasında geçiş yapmak için bir ortam değişkeni kullanmak için kodu kullandım startup.el
ve yamayı # 15539'dan ekledim . Hiçbiri verilmezse, varsayılan kullanılır.
Ara boşluklarla ilgili bir sorun vardı: async
değiştirilen init dizini hakkında bir şey bilmiyor ve bu nedenle gerekli bazı dosyaları bulamıyor. Ancak bu son zamanlarda boşluklarda çözüldü: .emacs.d dışında bir config dizini kullanıldığında hata oluştu · Sayı # 3390
Öyleyse işte ~/.emacs
orjinal init-code gibi davranmalı fakat yapılandırılabilir init dizini ile
;;; .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
Ayrıca, fazladan çaba göstermeden bir arka plan programı olarak çalışmasını sağlayan hoş bir ek de var: sunucu ismi init dizininin ismine ayarlanacak. Şimdi ikinci bir emac daemon'a vanilya spacemacs ile başlayabilirsiniz.
EMACS_USER_DIRECTORY=~/.emacsenv.d/spacemacs emacs --daemon
ve hala emacsclient kullanın
emacsclient -s spacemacs -c -e '(message "Hello spacemacs")'
Usecase'im çok basit ve şaşırdım, tek kişi benim: Sürekli çalışan bir emacs cini kullanıyorum ve onu gui ve konsoldan kullanıyorum (örneğin ssh ile). Bu emacs ben tüm belgeleri ve çalışma günlüğümü hazırlıyorum, bu yüzden her zaman orada olmalı. Fakat daha sonra boşlukları ya da diğer dağıtım paketlerinden birini denemek ve hatta mevcut konfigürasyonumu geri çekinceye ya da zekice fikirlerden bazılarını kullanana kadar yapılandırmak istiyorum. Ve diğerleri gibi, çalışma arkadaşlarım için basit bir temel konfigürasyon oluşturmak ve çalışan örneğimde org-mode ile belgelemek istedim.
Bildiğim tek sorun async
ve değiştirilen init dir. Hakkında bir şey bilmediğinden, async
varsayılan olarak enjekte edilmesi gereken değişkenlere sahip olan bazı konfigürasyonları eklemenin en iyi yolu olduğunu düşünüyorum. ait çağırmaları async-start
spacemacs yaptığı gibi.