चूँकि किसी फ़ाइल को लोड करने की तुलना में init पर अधिक काम करना है और दूसरी ओर मेरे रनटाइम वातावरण में सहानुभूति .emacs.d
या HOME
परिवर्तन करना है, इसलिए मैंने उस संस्करण का विकल्प चुना जो @glucas ने प्रस्तावित किया था। मैंने विभिन्न init dirs के बीच स्विच करने के लिए एक पर्यावरण चर का उपयोग करने के लिए # 15539startup.el
से कोड जोड़ा और पैच का उपयोग किया। यदि कोई नहीं दिया जाता है, तो डिफ़ॉल्ट का उपयोग किया जाता है।
स्पेसमैक्स के साथ एक समस्या थी: बदली हुई इनिट async
डायरेक्टरी के बारे में नहीं पता है और इसलिए कुछ आवश्यक फाइलें नहीं मिल रही हैं। लेकिन यह हाल ही में spacemacs में हल किया गया है: .emacs.d के अलावा अन्य कॉन्फ़िगरेशन निर्देशिका का उपयोग करते समय त्रुटि · समस्या # 33
तो यहाँ मेरा है ~/.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
एक अच्छा जोड़ भी है जो इसे अतिरिक्त प्रयास के बिना डेमॉन के रूप में काम करता है: सर्वर-नाम को इनिट डायरेक्टरी के नाम पर सेट किया जाएगा। तो अब आप वेनिला स्पेसमैक्स के साथ एक दूसरा इमैक डेमन शुरू कर सकते हैं
EMACS_USER_DIRECTORY=~/.emacsenv.d/spacemacs emacs --daemon
और अभी भी emacsclient का उपयोग करें
emacsclient -s spacemacs -c -e '(message "Hello spacemacs")'
मेरा usecase बहुत सरल है और मैं चकित हूं, कि मैं केवल एक ही हूं: मेरे पास हमेशा चलने वाला ईमैक डेमॉन है और इसे gui और ओवर कंसोल (उदाहरण के लिए ssh के साथ) का उपयोग करें। इस emacs में मैं अपने सभी दस्तावेज और कार्य लॉग तैयार करता हूं, इसलिए इसे हर समय होना चाहिए। लेकिन फिर मैं स्पेसकैम या अन्य वितरण पैकेजों में से एक का प्रयास करना चाहता हूं और यहां तक कि इसे कॉन्फ़िगर भी कर सकता हूं, जब तक कि मैं अपने वर्तमान कॉन्फ़िगरेशन को रिटायर नहीं कर सकता या कुछ चतुर विचारों का उपयोग नहीं कर सकता। और दूसरों के रूप में, मैं अपने सहकर्मियों के लिए एक सरल आधार विन्यास बनाना चाहता था - और इसे अपने चल रहे उदाहरण में org-mode के साथ दस्तावेज़ित करता था।
चूंकि एकमात्र समस्या जो मुझे पता है async
और यह है कि यह परिवर्तित init dir के बारे में नहीं जानता है, मुझे लगता है कि इसके लिए कुछ विन्यास जोड़ने के सर्वोत्तम तरीके के बारे async
में चर हैं जिन्हें डिफ़ॉल्ट रूप से इंजेक्ट किया जाना चाहिए, ताकि सभी को पैच करना आवश्यक न हो async-start
अंतरिक्ष यात्रियों के बस के चालान किए गए थे।