एक अलग कंप्यूटर पर एक ही Emacs पर्यावरण कैसे प्राप्त करें?


16

मैं Emacs में एक शुरुआत कर रहा हूँ (अब के बारे में 2 सप्ताह के लिए इसका इस्तेमाल कर रहा है और इसे प्यार करता हूँ)। जैसा कि मैंने अपनी ~/.emacs.d/init.elफ़ाइल को अपडेट और विस्तारित किया है , जो चीजें मैं वहां लिखता हूं वे कुछ निश्चित पैकेजों पर निर्भर करते हैं जो मैंने एमईएलपीए से स्थापित किए थे M-x package-install, उन .elफाइलों पर, जो मैंने खुद लिखे हैं, आदि।

मेरा सवाल यह है कि क्या मुझे भविष्य में कंप्यूटर को स्विच करना चाहिए, उदाहरण के लिए, नए कंप्यूटर पर समान रूप से सटीक Emacs वातावरण प्राप्त करने का सबसे अच्छा तरीका क्या है?


3
जब तक आप अपने init.elआस-पास घूम सकते हैं (उदाहरण के लिए git का उपयोग करके), यह दृष्टिकोण भी काम करता है (आधारित use-package): lunaryorn.com/posts/…
VanLaser

एक दृष्टिकोण ड्रॉपबॉक्स में अपनी .emacs.d निर्देशिका को रखना है। मैंने इसे एक ही OS वाले कंप्यूटर में इस्तेमाल किया है। * निक्स के अलग-अलग फ्लेवर ठीक होने चाहिए, लेकिन अगर आपके पास ऐसी मशीनें चल रही हैं, जो बहुत अलग हैं, तो आपको समस्या हो सकती है।
कुदित

यह सवाल emacs.stackexchange.com/q/408/2710 के बहुत करीब है । क्या आप मतभेदों को उजागर कर सकते हैं?
एंड्रयू स्वान

अपने आप जैसे गैर-प्रोग्रामर के लिए, Google ड्राइव का उपयोग करके तीन मशीनों (दो विंडोज़, एक OSX) के पार emacs कॉन्फ़िगरेशन और पैकेज को सिंक्रनाइज़ करना प्रभावी और विश्वसनीय रहा है। यह काम करता है क्योंकि emacs और इसके अधिकांश पैकेज काफी हद तक प्लेटफॉर्म एग्नॉस्टिक हैं। समरूप एमएसीएस अनुभव के क्रॉस प्लेटफॉर्म प्रजनन के लिए init.el फ़ाइल में केवल कुछ पंक्तियों की आवश्यकता होती है जो OS के पथ को सिंक्रनाइज़ किए गए emacs पैकेज निर्देशिका में हल करने के लिए होती है।
स्नेलेनी जूल

आपका कॉन्फ़िगरेशन आपकी पूरी ~/.emacs.dनिर्देशिका है, इसलिए मशीनों के बीच जो भी आप सिंक्रनाइज़ करना चाहते हैं, उसका उपयोग करें। (जैसे जीथब रिपॉजिटरी, या ड्रॉपबॉक्स फ़ोल्डर, या जो भी आपके लिए सबसे अच्छा काम करता है)।
फिल्स

जवाबों:


9

सही समाधान का उपयोग करना है straight.el, एक पैकेज प्रबंधक जिसे मैंने इस समस्या को हल करने के लिए लिखा था। आप इस प्रश्न के एक अन्य उत्तर में इसके बारे में अधिक विवरण पा सकते हैं ।

यह उत्तर, जिस पर मैंने काम शुरू करने के महीनों पहले लिखा था straight.el, पहले एक आंशिक समाधान प्राप्त करने का एक सख्त अवर तरीका बताया। इस दृष्टिकोण को संक्षेप में नीचे वर्णित किया गया है; मैं अब इसकी सिफारिश नहीं करता।

यहां तक ​​कि अगर आप का उपयोग नहीं करना चाहते हैं straight.el, तो भी आपको कम से कम अपनाना चाहिए use-package। (ऐसा नहीं है कि दोनों परस्पर अनन्य हैं - मेरा मानना ​​है कि सबसे साफ सेटअप दोनों का उपयोग करने से आता है।)


अपनी इन-फाइल में संकुल की सूची को परिभाषित करके शुरू करें:

(defvar my-packages
        '(
          aggressive-indent
          avy
           .
           .
           .
          projectile
          undo-tree
          )
  "List of packages to be installed at Emacs startup.")

फिर उन्हें स्वचालित रूप से स्थापित करें:

(require 'cl-lib)
(package-initialize)
(unless (cl-every #'package-installed-p my-packages)
  (dolist (package my-packages)
    (unless (package-installed-p package)
      (package-install package))))

यदि आप अपनी init.elफ़ाइल को संस्करण नियंत्रण में रखते हैं, तो इसे किसी अन्य मशीन से समन्वयित करने से आपके पैकेज अपने आप स्थापित हो जाएंगे। बेशक, इंस्टॉल किए गए संस्करण पूरी तरह से अलग होंगे, और परिणामस्वरूप आपके कॉन्फ़िगरेशन को बॉक्स से बाहर काम करने की उम्मीद नहीं की जा सकती है। यह एक मूलभूत दोष है package.elऔर इसका एक कारण है कि यह दृष्टिकोण खराब क्यों है। फिर से देखें straight.el। यह भी ध्यान दें कि ऊपर उल्लिखित कोड आपकी पैकेज सूची को उन पैकेजों के लिए आपके कॉन्फ़िगरेशन से अलग करता है, जिससे आपकी इन-फाइल में चीजों पर नज़र रखना मुश्किल हो जाता है। यह एक और बड़ा नुकसान है। फिर से देखें use-package


अद्यतित करने के लिए धन्यवाद! यदि मैं गितुब पर सब कुछ होस्ट करने का विकल्प चुनता हूं, जिसमें मैंने एमईएलपीए से डाउनलोड किए गए पैकेजों को शामिल किया है, तो क्या इससे नए कंप्यूटर पर पैकेजों को ऑटो-अपडेट करने की एमईएलपीए की क्षमता बरकरार रहेगी?
space_voyager

1
@space_voyager हां, सब कुछ अभी भी उसी तरह होगा। हालाँकि: (1) जब आप एक नए कंप्यूटर के लिए क्लोन करते हैं, तो Emacs को MELPA से पैकेज डाउनलोड करने की आवश्यकता नहीं होगी , क्योंकि वे पहले से ही रिपॉजिटरी में हैं जो आपने अभी क्लोन किया था; और (2) जब भी आप package.elपैकेजों को अपडेट करने के लिए उपयोग करते हैं, तो आपके पास रिपॉजिटरी में अनस्टेज्ड बदलाव होंगे, और पैकेज अपडेट्स को शामिल करने के लिए आपको कमिट करना पड़ेगा।
रेडॉन रोसबोरो

बहुत धन्यवाद। एक और बात: मुझे लगा कि MELPA अपने आप ही पैकेज अपडेट करता है। क्या यह मामला नही है?
space_voyager

1
@space_voyager: ठीक है, बेशक रिमोट पैकेज रिपॉजिटरी को अपडेट किया जाएगा, लेकिन पैकेज के अपडेट किए गए संस्करण स्वचालित रूप से आपके स्थानीय मशीन पर डाउनलोड और इंस्टॉल नहीं किए जाते हैं। इसके लिए आपको चाहिए M-x list-packages RET U
रेडॉन रोसबोरो

1
@ लस्सी संक्षिप्त उत्तर: आप जो भी Emacs स्थापित करना चाहते हैं उसका उपयोग करें; straight.elकेवल Emacs संकुल को स्थापित करने के लिए उपयोग करें । निक्स एक शानदार विचार है, लेकिन यह एमएसीएस पैकेज के विकास के लिए अच्छी तरह से अनुकूलित नहीं है, जहां तक ​​मुझे पता है (कृपया मुझे सही करें) । यदि आप Emacs संकुल को स्थापित करने के लिए एक सिस्टम पैकेज मैनेजर का उपयोग करते हैं, तो आप केवल उनके स्रोत कोड को संपादित करने में सक्षम नहीं होंगे और फिर अपने परिवर्तनों को बदल सकते हैं। पिछली बार जब मैंने Emacs संकुल के लिए एक Nix विन्यास को देखा, तो यह अत्यधिक जटिल लग रहा था और आमतौर पर straight.elविकास के अनुभव से हीन था । लेकिन, जो भी आपकी नाव तैरता है।
रेडन रोसबोरो

11

यदि आप उपयोग -पैकेज का उपयोग करते हैं , तो आप उस फ़ाइल को कंप्यूटर से कंप्यूटर में इधर-उधर कर सकते हैं, और जब Emacs शुरू होता है, जब तक आपके पास इंटरनेट का उपयोग होता है, यह पैकेजों में खींच लेगा और उन्हें कॉन्फ़िगर करेगा।

सबसे पहले, पैकेज लाइब्रेरी स्थापित करें:

(require 'package)
(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)

और फिर बूटस्ट्रैप use-package:

(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

(eval-when-compile (require 'use-package))

अब, Emacs को कॉन्फ़िगर करने और मानने के बजाय पैकेज स्थापित किए गए हैं, use-packageदोनों को इंस्टॉल और कॉन्फ़िगर करने के लिए उपयोग करें। उदाहरण के लिए, मेरी कुछ हेल्म सेटिंग्स के लिए:

(use-package helm
  :ensure t
  :bind (("M-x" . helm-M-x)
         ("M-y" . helm-show-kill-ring)
         ("C-x C-f" . helm-find-files)
         ("M-s o" . helm-occur))

  :config
  (helm-mode 1)
  (setq helm-echo-input-in-header-line t))

आप पर ध्यान दें, जो कि विन्यास (इन init.el) को पार करता है, लेकिन इसके लिए बहुत कुछ है। उदाहरण के लिए, इस अभ्यस्त पोर्ट dabbrev फ़ाइलें, या अपने कस्टम स्निपेट्स या किसी भी अन्य टन का एक टन।
ओमैर माजिद

हाँ। यदि आपके पास अन्य फ़ाइलें हैं जो आपके कॉन्फ़िगरेशन का हिस्सा हैं, तो आपको अपनी इनिट फ़ाइल के साथ उन्हें भी स्थानांतरित करना होगा।
ज़ॉक

उस बिंदु पर, यह फिर से "गेम का एक गेम बन जाता है जो वास्तव में मेरे कॉन्फ़िगरेशन का हिस्सा है और मैं इसे अपनी मशीनों के साथ कैसे रखता हूं" :(
ओमैर माजिद

आप जोड़ना चाहिए :ensure tकरने के लिए use-packageघोषणा या सेट use-package-always-ensureकरने के लिए t। अन्यथा यह स्वचालित रूप से कॉन्फ़िगर किए जाने पर कॉपी किए जाने पर किसी अन्य सिस्टम पर स्थापित नहीं होगा।
चक्रवर्ती रघुनंदन

6

अगली पीढ़ी के पैकेज प्रबंधन के साथ straight.el

package.elअपने पैकेजों को प्रबंधित करने के लिए + क्वेलपा का उपयोग करने के लिए एक लंबे और निराशाजनक संघर्ष के बाद , मैंने बुलेट को थामा और अपने पैकेज मैनेजर को लिखा । यह पूरी तरह से package.elएक पैकेज प्रबंधन अनुभव प्रदान करके प्रतिस्थापित करने का इरादा है जो लगभग हर तरह से बेहतर है ।

आप इसकी सभी विशेषताओं के बारे में जानने के लिए बहुत व्यापक दस्तावेज पढ़ सकते हैं , लेकिन इस प्रश्न के लिए सबसे अधिक प्रासंगिक यह है कि यह सही प्रजनन क्षमताstraight.el पर केंद्रित है । इसका मतलब यह है कि यह कोई फर्क नहीं पड़ता कि आप एमएसीएस को सामान्य रूप से शुरू कर रहे हैं, या इसे एक नई मशीन पर शुरू कर रहे हैं, और यह कि किसी भी स्थानीय परिवर्तन को संस्करण-नियंत्रित किया जाता है और इसे एक विहित स्थिति में वापस लाया जा सकता है। व्यावहारिक रूप से, यह Git रिपॉजिटरी के रूप में (1) क्लोनिंग पैकेज द्वारा प्राप्त किया जाता है, और अपने राज्य के प्रबंधन के लिए स्वचालित उपकरण प्रदान करता है; (2) पैकेज प्रबंधन राज्य के लिए सत्य के एकमात्र स्रोत के रूप में init-file का उपयोग करना , जिसमें कोई भी अन्य परिवर्तनशील डेटा संग्रहीत नहीं है; और (3) वैकल्पिक पैकेज लॉकफाइल्स का उपयोग करके प्रत्येक पैकेज के सटीक गिट संशोधन, साथ ही किसी भी रेसिपी रिपॉजिटरी और निर्दिष्ट करने के लिएstraight.el अपने आप।

आरंभ करने के लिए, बूटस्ट्रैप स्निपेट डालें , जो इंस्टॉल और सक्रिय हो जाएगा straight.el। फिर, यह सुनिश्चित करने के लिए कि एक पैकेज स्थापित है, बस straight-use-packageअपने इनिट-फाइल में कॉल करें :

(straight-use-package 'projectile)

हाँ, यह इतना आसान है। package-refresh-contentsकिसी कचरे से या किसी भी तरह का व्यवहार नहीं । यदि आप अपनी आईआईटी-फाइल से इस फॉर्म को निकालते हैं और Emacs को पुनरारंभ करते हैं, तो प्रोजेक्टाइल अब लोड नहीं होगा (इसके विपरीत package.el)। इसका मतलब है कि आपको किसी नई मशीन पर काम न करने के लिए अपने कॉन्फ़िगरेशन के बारे में चिंता करने की ज़रूरत नहीं है क्योंकि आप गलती से अघोषित पैकेज पर निर्भर हैं।

आप अपनी इन-फाइल (जहां एक ही बिंदु पर उनकी सूची घोषित करने की कोई आवश्यकता नहीं है) आप जहां भी और जब भी चाहें पैकेज स्थापित कर सकते हैं। बेशक आप भी बस कर सकते हैं

(dolist (package '(ace-jump-mode ... zzz-to-char)) (straight-use-package package))

यदि आप सूची पसंद करते हैं। मैं हालांकि यह सलाह देता हूं कि आप use-packageअपने पैकेज कॉन्फ़िगरेशन को प्रबंधित करने के लिए उपयोग करें। पहले आपको इसे स्थापित करना होगा:

(straight-use-package 'use-package)

फिर, चूंकि straight.elअंतर्निहित एकीकरण के साथ use-package, निम्नलिखित "बस काम करता है":

(use-package projectile
  :straight t
  :init (projectile-mode 1))

एक बार जब आप अपनी init- फाइल लिख लेते हैं, तो इसकी जरूरत के पैकेज को इंस्टॉल करने के लिए, M-x straight-freeze-versionsएक संस्करण लॉकफाइल को बचाने के लिए चलाएँ ~/.emacs.d/straight/versions/default.elstraight.elजब आप पहली बार एक नई मशीन पर Emacs लॉन्च करते हैं, तो आपको इस फ़ाइल को संस्करण नियंत्रण में रखना चाहिए, क्योंकि यह आपके सभी पैकेजों के सही संस्करणों की जांच करने की अनुमति देगा । (आप लॉकफ़ाइल का उपयोग करके निर्दिष्ट संस्करणों में मैन्युअल रूप से वापस आ सकते हैं M-x straight-thaw-versions।)

मशीन-स्थानीय डॉटफ़ाइल्स के विचार का समर्थन करने के लिए जिसका मैंने अपने अन्य उत्तर में उल्लेख किया था , straight.elएक प्रोफाइल सिस्टम प्रदान करता है । मैं अभी भी आपके dotfiles (यदि इस मामले में init.el, आपकी स्थानीय init- फ़ाइल लागू हो, और यदि आप एक का उपयोग करना चाहते हैं, तो संस्करण लॉकफाइल) आपके सिम्फ़लिंक के लिए सिम्लिंक का उपयोग करने की सलाह देते हैं ।

यदि आप सोच रहे हैं कि straight.elअन्य पैकेज प्रबंधकों के साथ तुलना कैसे की जाए , तो व्यापक तुलना अनुभाग देखें । लेकिन बाकी सब चीजों पर बहुत अधिक प्रलेखन है।


4

आप अपने पैकेजों को प्रबंधित करने के लिए पीपा का उपयोग कर सकते हैं । स्रोत नियंत्रण के लिए git / github का प्रयोग करें और अपने emacs dotfiles को सिंक करें।

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