नियमित रूप से emacs के साथ अंतरिक्षयान चलाना: अलग .emacs.d कैसे रखें


32

मैं स्पेसकम की कोशिश करना चाहूंगा। लेकिन मैं अभी तक अपने नियमित emacs कॉन्फ़िगरेशन से स्विच नहीं करना चाहता, इसलिए मुझे वह कॉन्फ़िगरेशन पसंद आएगा जो वर्तमान में मेरे .emacs.dएक निर्देशिका में होना चाहिए, और spacemacs के लिए समान कॉन्फ़िगरेशन किसी अन्य निर्देशिका में होना चाहिए। मुझे कोई आपत्ति नहीं है कि निर्देशिका का क्या नाम है।

क्या यह संभव है, चौराहों / LD_PRELOAD / ऐसी अन्य प्रवंचनाओं की कमी? मैं यह कैसे कर सकता हूं?


2
दान के एक ऐसे ही प्रश्न का उत्तर भी देखिए, जब मैं Emacs शुरू होने पर विकल्पों के साथ टाइमर सेट करने के बारे में था: emacs.stackexchange.com/questions/3588/… मैं उस उत्तर के थोड़े बदलाव का उपयोग कर रहा हूं।
कानून सूची

1
"अन्य प्रवंचना" की श्रेणी में, शायद, आप एमाक्स spacemacsको निष्पादन योग्य इंगित करने वाला सिमलिंक बना सकते हैं और (car command-line-args)यह तय करने के लिए किस इनिट फ़ाइल को चलाने के मूल्य का उपयोग कर सकते हैं। यह निश्चित रूप से, यह है कि आप ओएस एक्स के अलावा एक यूनिक्स प्रणाली पर चल रहे हैं। (जिस तरह से ऐप बंडल ओएस एक्स पर काम करता है वह इस चाल को पूरा करने के लिए मुश्किल बनाता है।)
हैराल्ड हैन्च-ऑलसेन

1
यहां एक और दृष्टिकोण देखें: emacs.stackexchange.com/q/4253/780
ग्लूकोज

2
मैं सिर्फ 18 महीने बाद कहने के लिए वापस आया, यह अभी भी कारण है कि मैंने स्पेसमैक्स नहीं सीखा है। मुझे स्वीकार किए गए जवाब के साथ कुछ परेशान करने वाली समस्याएं थीं, बस फिर से कोशिश की, अभी भी सच है। ऑर्ग लेयर को जोड़ने के बाद "प्रतीक का कार्य परिभाषा शून्य है: लूप" अभी। मुझे नहीं पता कि यह कारण का हिस्सा है, लेकिन यह वास्तव में समस्या है: एक पॉलिश "बैटरी शामिल" परियोजना के लिए, यह सिर्फ एक साथ कुछ करने के लिए इसे शुरू करने के लिए अजीब लगता है, तो आश्चर्य है कि अगर मेरे विन्यास का समर्थन किया है? शायद अनुचित लेकिन इससे मुझे विश्वास खोना पड़ता है। हो सकता है कि अगले 18 महीनों में यह तय हो जाए ...
क्रोड लैंगशान

जवाबों:


20

एक विकल्प यह निर्दिष्ट करना है कि आप ~/.emacsफ़ाइल में कौन सा कॉन्फ़िगरेशन लोड करना चाहते हैं । जब Emacs शुरू होता है तो यह देखने से पहले इस तरह की फाइल को देखेगा ~/.emacs.d/। अधिक जानकारी के लिए आप Emacs मैन्युअल में Init फ़ाइल के बारे में पढ़ सकते हैं ।

इसलिए उदाहरण के लिए आप एक बना सकते हैं ~/.spacemacs.dऔर अपने मौजूदा ~/.emacs.dको बनाए रख सकते हैं । फिर ~/.emacsलोड करने के लिए जो भी आप उपयोग करने के मूड में हों, बनाएं :

(setq use-spacemacs t)   ; or nil 

(when use-spacemacs
  (setq user-emacs-directory "~/.spacemacs.d/"))   ; defaults to ~/.emacs.d/

(load (expand-file-name "init.el" user-emacs-directory))

यदि आप चाहते हैं कि आप .emacs फ़ाइल को संशोधित किए बिना कॉन्फ़िगर स्विच करने के तरीकों के साथ आ सकते हैं। उदाहरण के लिए, अपने .emacs को कुछ पर्यावरण चर के लिए जाँचें जो आपने अपने शेल में या किसी स्क्रिप्ट में सेट किया है जिसका उपयोग आप स्पेसमैक्स शुरू करने के लिए करते हैं:

(setq use-spacemacs (getenv "USE_SPACEMACS"))

1
निश्चित रूप से, यह बताने के लिए अंदर से एक रास्ता होना चाहिए कि क्या आप स्पेसमेक्स चला रहे हैं या नहीं? उदाहरण के लिए, fboundpकिसी फ़ंक्शन या कमांड के लिए जाँच (साथ ) जो कि स्पेसमैक्स के लिए अद्वितीय है?
हेराल्ड हैन्च-ऑलसेन

2
ज़रूर, लेकिन यह सवाल नहीं था जैसा कि मैंने इसे समझा। Spacemacs सिर्फ एक emacs config है, और OP जानना चाहता है कि एक से अधिक स्वतंत्र emacs config dir कैसे बनाए रख सकते हैं।
ग्लूकोज

1
@ हैराल्डचेच-ऑलसेन जिसने मुझे डाउनलोड करते समय बहुत आश्चर्यचकित किया, लेकिन जब मैंने इसके बारे में सोचा तो इसका पूरा मतलब था। मुझे लगता है कि इसका कारण यह है कि हम उम्मीद करते हैं कि ज्यादातर सिस्टम के लिए, स्पेसमैक्स जैसा पॉलिश 'प्रोडक्ट' बनाने के लिए ऐसा लगता है, कुछ निचले स्तर की सिस्टम लैंग्वेज को ट्रूडल करना आवश्यक है - लेकिन ईमैक्स में इतना एक्स्टेंसिबिलिटी है (धन्यवाद elisp) यह आवश्यक नहीं है।
क्रोड लैंगशान

1
मैंने इसे स्वीकार किया, लेकिन वास्तव में इसकी कोशिश नहीं की थी। अब जब मेरे पास है, तो यह काफी काम नहीं कर रहा है: फ़ाइल त्रुटि: लोड फ़ाइल, /home/me/.emacs.d/core/core-load-paths.el को खोल नहीं सकता - मुझे इसके लिए आवश्यक (setq user-emacs-directory "~/.spacemacs.d/")था काम ( prognअपने सशर्त के spacemacs शाखा पर)। क्या आप इसे अपने उत्तर में जोड़ सकते हैं ताकि मैं इसे फिर से स्वीकार कर सकूं?
क्रोड लैंगशान

2
@glucas मैं win10 पर हूं, किसी कारण से घर को c: / users / nate को सौंपा गया था। पर्यावरण चर को हटा दिया और सब कुछ ठीक काम किया।
नथानिएल सक्से

12

चूँकि किसी फ़ाइल को लोड करने की तुलना में 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अंतरिक्ष यात्रियों के बस के चालान किए गए थे।


यह वास्तव में सुंदर है और खूबसूरती से काम किया है ... जब तक मुझे उपयोग करने की आवश्यकता नहीं है async। :-( चूंकि आपके पोस्ट किए हुए कुछ महीने हो गए हैं, क्या आपके पास वर्कअराउंड है?
ट्रे

दुर्भाग्य से नहीं - लेकिन स्पेसमैक्स के लिए यह तय हो गया है और सामान्य रूप से async के लिए मैं वास्तव में निश्चित नहीं हूं कि कोई बदलाव होना चाहिए, क्योंकि async-startबिना कुछ के एमएसीएस शुरू हो जाता है और यदि आप कुछ चर का उपयोग करना चाहते हैं, तो आपको इसे पास करना होगा। लेकिन यकीन है, अच्छा और सुविधाजनक हो, अगर async को चर की एक सूची के साथ कॉन्फ़िगर किया जा सकता है, जिसका उपयोग हर आह्वान पर किया जाएगा async-start
उवे कोलोसका

1
इस दृष्टिकोण के साथ, अन्य चर हो सकते हैं जो आपके .emacs के लोड होने से पहले डिफ़ॉल्ट उपयोगकर्ता-इमैक-निर्देशिका से आरंभ हो जाते हैं। उदाहरण के लिए मुझे (setq custom-theme-directory user-emacs-directory)यहां जोड़ने की जरूरत थी ।
ग्लूकोज

1
मुझे नहीं पता कि यह चर कहां सेट किया गया है, क्योंकि जब मैं इसे न्यूनतम टेस्टेनव के अंदर जांचता हूं, तो मुझे मिलता है: इसका मूल्य "~ / .emacs.d /" है। मूल मूल्य "~ / .emacsenv.d / init-test /" था, इसलिए इसका सही मूल्य है, लेकिन इसे अधिलेखित कर दिया गया था।
उवे कोलोस्का

1
मैंने वास्तव में सवाल पूछने के लंबे समय बाद इस जवाब का उपयोग किया। मैंने स्वीकार किए गए उत्तर को नहीं बदला है क्योंकि यह बहुत लंबा है और क्योंकि मैंने वास्तव में कार्यान्वयन पर ज्यादा ध्यान नहीं दिया है! यह उत्तर मेरे लिए बहुत उपयोगी रहा है, यद्यपि।
क्रोड लैंगशान

5

इसे यहाँ समझाया गया है , और इसे प्रलेखन में जोड़ने के लिए एक चालू पीआर है:

mkdir ~/spacemacs
git clone git@github.com:syl20bnr/spacemacs.git ~/spacemacs/.emacs.d
HOME=~/spacemacs emacs```

6
हां, मैं कभी-कभी वैकल्पिक कॉन्फ़िगरेशन को आज़माने के लिए होम बदल देता हूं। नकारात्मक पक्ष यह है कि घर का उपयोग अन्य चीजों के लिए किया जाता है जिन्हें आप प्रभावित नहीं करना पसंद कर सकते हैं।
ग्लूकास

3

यह पहले से ही उत्तर दिया गया है और स्वीकार किया गया है, लेकिन अगर आपको लगता है कि चीजों को करने के नए तरीके आज़माने का तरीका है (emacs कॉन्फ़िगर से परे) तो मैं आपको जीएनयू स्टोव के साथ खुद को परिचित करने में आधे घंटे बिताने की सलाह दूंगा। यह ln -sस्टेरॉयड पर है, और इसका उपयोग करने के लिए कई दृष्टिकोण हो सकते हैं। आपके पास एक उपनिर्देशिका (ऑफलाइनइमैप कॉन्फिगरेशन, एमएसीएस कॉन्फिगर्स आदि सहित) के तहत पूरा सेटअप हो सकता है - जो कि पर्यावरण आधारित दृष्टिकोण होगा - या आपके पास प्रत्येक एप्लिकेशन के लिए एक अलग उपनिर्देशिका होगी। स्वीट सिज़ोफ्रेनिया।

मेरी ~ / स्टोव से उदाहरण के लिए ईमैक्स से संबंधित लिस्टिंग:

-> % ls ~/Stow | grep emacs
emacs 
emacs_from_scratch
spacemacs
hoodoo@T450s 2:46 [~]

वहाँ एक प्रारंभिक विन्यास मैं प्रयोग करने योग्य है, एक 'मैं चूक के साथ छड़ी' विन्यास और एक 'मैं कर रहा हूँ मेरे अपने रोल करने के लिए कामयाब रहे हैं'। मैं इनमें से प्रत्येक को चालू और बंद कर सकता हूं और हमेशा उन सभी को उपलब्ध कर सकता हूं। प्रत्येक उपखंड में मेरा ~ के सापेक्ष एक पूरा पेड़ हो सकता है और यह मिश्रण और मैच के लिए बहुत आसान है।


जैसा कि होता है मैं पहले से ही स्टोव का उपयोग करता हूं। लेकिन आप इसके लिए इसका उपयोग कैसे करते हैं? आप स्टोव का उपयोग करके अपने द्वारा उपयोग किए जा रहे / आउट सिम्क्लिंकिंग द्वारा सिर्फ अपने '.emacs.d' को 'डायनामिकली स्कूपिंग' कर रहे हैं? क्या आप कभी एक ही समय में दोनों चलाते हैं? यदि ऐसा है, तो मुझे लगता है कि दोनों भावनाएं उन्हें "अपना" .emacs.d लगता है। मुझे आश्चर्य है कि अगर वहाँ राज्य को बचाने वाली चीज़ों के साथ कुछ विषमताएं पैदा हो सकती हैं, जैसे कि मुझे पता नहीं है कि हाल ही में, सेवहिस्ट, ऑटोसैव, आदि विशेष रूप से जब एमएसीएस की दो प्रतियां मौलिक रूप से अलग-अलग कॉन्फ़िगरेशन के साथ चल रही हैं?
क्रोड लैंगशान

नहीं, मैं विन्यास को आवश्यकतानुसार स्विच करता हूं।
रोमन ग्रेज्डन

2

मैंने उस पैच को चेक किया जो @Uwe Koloska का उपयोग करता था। यह मुख्य शाखा में शामिल नहीं था। मैं कुछ हद तक सहमत हूं, मुझे लगता है कि शेल का उपयोग करके emacs के बाहर समस्या को हल किया जाना चाहिए और emacs को छोड़ने से इसके बारे में कुछ भी नहीं पता है।

हो सकता है कि यह सुविधा उपयोगकर्ता के दृष्टिकोण से अधिक तार्किक होगी, ध्वज का उपयोग करना कुछ उपयोगकर्ताओं के लिए कम जटिल होगा।

अपने उपयोग के मामले में मैं अपने Emacs की स्थापना और Spacemacs को रखना चाहता हूं, इसलिए ऊपर दिए गए दो समाधानों की मेरी भिन्नता इस तरह से काम करती है।

शेल स्क्रिप्ट

स्पेसमेक्स लॉन्च करने के लिए सबसे पहले स्क्रिप्ट:

#!/bin/sh

export EMACS_USER_DIR=~/spacemacs/emacs.d

exec emacs "$@"

यह स्क्रिप्ट कहा जाता है spacemacsऔर /usr/local/binफ़ोल्डर में स्थापित है ।

.emacs फ़ाइल

तब मुझे .emacsअपने होम फोल्डर में एक फाइल की जरूरत होती है जो पर्यावरण चर को ठीक से समझे EMACS_USER_DIR

(defvar user-custom-dir (getenv "EMACS_USER_DIR"))

(when (/= (length user-custom-dir) 0)
  (setq user-emacs-directory (file-name-as-directory user-custom-dir)))

(load (expand-file-name "init.el" user-emacs-directory))

मैं बिल्कुल भी अनुभव नहीं कर रहा हूँ इसलिए मैं इस पर आया, और अधिक अनुभवी लोग शायद कुछ बेहतर कर सकते हैं। लेकिन हे, यह काम करता है।

आकर्षक व मनोरंजक

फिर एक आइकन क्यों न जोड़ा जाए:

आइकन

[Desktop Entry]
Name=Spacemacs
GenericName=Text Editor
Comment=Edit text
MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-java;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-c;text/x-c++;
Exec=spacemacs %F
Icon=/home/marcs/.icons/spacemacs.svg
Type=Application
Terminal=false
Categories=Development;TextEditor;
StartupWMClass=Emacs
Keywords=Text;Editor;

3
आपकी शेल-स्क्रिप्ट का उपयोग करना चाहिए exec emacs "$@"
उवे कोलोस्का

हाँ, टिप के लिए धन्यवाद, बस तय।
मार्क्स

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.