Emacs में संकुल अद्यतन करना


144

मेरे पास पैकेजों के लिए निम्न सेटअप है (निश्चित रूप से एक बेहतर सिफारिश होने पर निश्चित नहीं है):

(require 'package)
(setq package-archives '(("ELPA" . "http://tromey.com/elpa/") 
                          ("gnu" . "http://elpa.gnu.org/packages/")
                          ("marmalade" . "http://marmalade-repo.org/packages/")))

; Apparently needed for the package auto-complete (why?)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.milkbox.net/packages/") t)

(package-initialize)
(setq url-http-attempt-keepalives nil)

मेरे पास संकुल की स्थापना और अद्यतन से संबंधित तीन प्रश्न हैं।

Q1। क्या उपलब्ध पैकेज (और सबसे हाल के संस्करणों) की सूची को अपडेट करने और एक विशिष्ट पैकेज को अपडेट करने का एक तरीका है?

Q.2 निम्नलिखित पैकेज स्रोतों में क्या अंतर है?

  • ELPA,
  • जीएनयू
  • मुरब्बा
  • Melpa

Q.3 क्या यह उस क्रम को मायने रखता है जिसमें उन्हें जोड़ा जाता है package-archives?


13
MELPA की आवश्यकता ऑटो-कम्प्लीट के लिए है क्योंकि जाहिर है कि कोई भी ऑटो-पूरा करने के लिए परेशान नहीं है। परेशान न हों, बल्कि अपनी सफाई करें package-archives। ELPA संग्रह से छुटकारा पाएं, जो अब बनाए नहीं रखा गया है, और मुरब्बा संग्रह, जो स्पष्ट मार्गदर्शन और रखरखाव के बिना आउट-डेटेड और डुप्लिकेट किए गए पैकेज की गड़बड़ी है। केवल मानक GNU संग्रह का उपयोग करें, और MELPA>
lunaryorn

2
धन्यवाद @lunaryorn! यह बहुत मददगार है। क्या आप जानते हैं कि मैं इस तरह की चीजों पर कैसे सूचित रह सकता हूं? (यानी "अच्छे-से-जाने-पहचाने" जैसे ये Emacs विकसित होते हैं)
Amelio Vazquez-Reina

3
सूचना वेब में स्वतंत्र रूप से चारों ओर बह रही है, बस इसे पकड़ें: Reddit पर अनुसरण करें / emacs, ब्लॉगों का अनुसरण करें और निक फेरियर, Bozhidar Batsov, Magnar Sveen, John Wiebley, आदि जैसे प्रसिद्ध Emacs लोगों के Twitter पर Freenode IRC पर #emacs ज्वाइन करें। और बहुत सारे।
चंद्रोदय

3
(setq package-enable-at-startup nil)यदि आप (package-initialize)स्वयं को बुलाने जा रहे हैं तो आपको चाहिए ।
फिल्स

2
धन्यवाद @ एफिल्स - इसकी आवश्यकता क्यों है?
अमिलियो वाज़केज़-रीना

जवाबों:


163
  1. पैकेज की सूची को स्वचालित रूप से अद्यतन करने के लिए, यदि पहले से कोई पैकेज सूची नहीं है , तो निम्न का उपयोग करें:

    (when (not package-archive-contents)
        (package-refresh-contents))

    सभी स्थापित पैकेजों को अपडेट करने के लिए, टाइप करें package-list-packages, जो आपको *Packages*बफर में ले जाएगा (और पैकेजों की सूची को भी अपडेट करेगा), और फिर टाइप करें U x

    package-refresh-contentsबिना शर्त सभी रिपॉज से एक पैकेज सूची डाउनलोड करने की कोशिश करता है जिसे आपने जोड़ा है package-archives; package-archive-contentsयदि आप पहले से ही पैकेज सूची डाउनलोड कर चुके हैं तो गैर शून्य है।

  2. ईएलपीए मूल है। मुझे नहीं लगता कि यह वास्तव में अब और बरकरार है, लेकिन मुझे यकीन नहीं है। मैं इसका इस्तेमाल नहीं करता।

    जीएनयू "आधिकारिक" है। यह Emacs के साथ बना हुआ है, जिसका अर्थ है कि चीजों को हमेशा काम करना चाहिए लेकिन अपडेट और नए पैकेज बहुत बार नहीं आते हैं।

    मुरब्बा मूल रूप से एक वेबसाइट है जहां आप एक पूरा पैकेज अपलोड कर सकते हैं, और इसे मुरब्बा रेपो में जोड़ा जाएगा। आप पैकेज के अपस्ट्रीम का लिंक सबमिट नहीं करते हैं, और यह पैकेज के निर्माण को पूरी तरह से स्वचालित नहीं करता है। मुझे लगता है कि यह राइट थिंग है, क्योंकि आप जरूरी नहीं कि अपस्ट्रीम को ट्रैक करना चाहते हैं। दुर्भाग्य से, यह थोड़ी देर के लिए अस्वीकार्य हो गया है, लेकिन किसी ने हाल ही में इसे ले लिया है इसलिए इसे किसी बिंदु पर वापस और बेहतर होना चाहिए।

    Melpa EmacsWiki तुतलाना क्षेत्र या एक GitHub रेपो जैसे के लिए एक URL लेता है, और इसे से स्वचालित रूप से एक पैकेज बनाता है। इस प्रकार यह आमतौर पर जो भी ट्रैकिंग कर रहा है उसके पीछे अधिकांश दिन होता है। हालांकि यह ऊपर की ओर ट्रैक करता है, मुझे अभ्यास में कभी कोई समस्या नहीं हुई, और यह वह जगह है जहां मेरे अधिकांश पैकेज हैं। वहाँ भी Melpa Stable है , जो Melpa की तरह है लेकिन नवीनतम रीविज़न के बजाय अपस्ट्रीम रेपो के संशोधन को पकड़ लेता है। Melpa स्थिर में Melpa की तुलना में कम पैकेज हैं।

    ऑर्ग मोड का अपना package.elरेपो ( http://orgmode.org/elpa/ ) है।

    पैकेज रिपॉज के सभी समान काम करते हैं, आप बस उन्हें अपने साथ जोड़ते हैं package-archives

    यहाँ इस विषय के बारे में अधिक गहराई से ब्लॉग पोस्ट है , जिससे मैं ज्यादातर सहमत हूँ।

  3. मुझे यकीन नहीं है, लेकिन मुझे लगता है कि अगर एक पैकेज को अलग-अलग रिपॉजिट में डुप्लिकेट किया जाता है, तो ऑर्डर package-archivesपूर्ववर्तीता में निर्धारित होता है। मुझे नहीं पता कि उच्च वरीयता सूची की शुरुआत या अंत में है।

    अद्यतन: Emacs 25 में, एक चर है package-archive-prioritiesजिसे आप अपने पैकेज रेपो को प्राथमिकता देने के लिए उपयोग कर सकते हैं (जैसे कि MELPA पर ELPA पसंद करते हैं)।


init.elयदि आप रुचि रखते हैं, तो यहां मेरा प्रासंगिक अनुभाग है :

(setq jpk-packages
      '(
        ac-dabbrev
        ...
        yasnippet
        ))

(package-initialize)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.org/packages/"))
(add-to-list 'package-archives
             '("org" . "http://orgmode.org/elpa/"))

;; install any packages in jpk-packages, if they are not installed already
(let ((refreshed nil))
  (when (not package-archive-contents)
    (package-refresh-contents)
    (setq refreshed t))
  (dolist (pkg jpk-packages)
    (when (and (not (package-installed-p pkg))
             (assoc pkg package-archive-contents))
      (unless refreshed
        (package-refresh-contents)
        (setq refreshed t))
      (package-install pkg))))

(defun package-list-unaccounted-packages ()
  "Like `package-list-packages', but shows only the packages that
  are installed and are not in `jpk-packages'.  Useful for
  cleaning out unwanted packages."
  (interactive)
  (package-show-package-list
   (remove-if-not (lambda (x) (and (not (memq x jpk-packages))
                            (not (package-built-in-p x))
                            (package-installed-p x)))
                  (mapcar 'car package-archive-contents))))

2
धन्यवाद! क्या when (not package-archive-contents)जाँच करता है ?
एमिलियो वाज़क्वेज़-रीना

3
सशर्त हर बार जब मैं ईमेक शुरू करता हूं तो मैं उसे ताज़ा करने से रोकता हूं (मैं आमतौर पर केवल यह जांचना चाहता हूं कि मैं इसे कब बताऊं)। यह केवल जाँच करता है कि क्या कोई पैकेज अभिलेखागार नहीं हैं, जो कि केवल तभी होना चाहिए जब मैं पहली बार किसी नई मशीन पर अपना कॉन्फिगर क्लोन करता हूँ।
jpkotta

बस आपको @Brandy ट्रेनर के उत्तर के बारे में बताना चाहिए, जो आपके उत्तर के पूरक लगता है - यदि यह मददगार है।
अमेलियो वाज़केज़-रीना

मुझे लगता है कि (refresh-package-contents)नए पैकेजों को डाउनलोड करने से पहले बिना शर्त कॉल करने की आवश्यकता है, क्योंकि अन्यथा Emacs एक पुराने पैकेज संस्करण (जो कि तब 404 है) को डाउनलोड करने की कोशिश कर सकते हैं, असफल हो सकते हैं, और लोड करना बंद कर सकते हैं।
व्लादिमीर पेंटेलेव

यह समझने का सबसे अच्छा तरीका क्या है कि कौन सा पैकेज अवांछित है? @jpkotta
alper

103

Emacs के भीतर, M-x list-packagesउन सभी पैकेजों को सूचीबद्ध करने के लिए उपयोग करें जो संग्रह सामग्री को स्वचालित रूप से ताज़ा करेंगे। बाद में Uअपग्रेड किए जाने वाले सभी अपग्रेड करने योग्य पैकेजों को चिह्नित करने और xवास्तव में नए अपडेट करने के लिए उपयोग करें। Emacs तब सभी उन्नयन लाएगा और स्थापित करेगा, और आपसे पुराने, अप्रचलित संस्करणों को निकालने के लिए कहेगा।

आप कार्टन पर एक नज़र डालना चाह सकते हैं जो आपके पैकेजों को एक समर्पित फ़ाइल में घोषित करके प्रबंधित करने का एक अधिक सुविधाजनक तरीका प्रदान करता है, और इस तरह से घोषित पैकेजों को स्वचालित रूप से स्थापित और अपग्रेड करने के लिए एक सुविधाजनक कमांड लाइन क्लाइंट शामिल है।


के आदेश package-archivesहै नहीं मायने रखते हैं। Emacs सभी संग्रहकर्ताओं की सामग्री को उपलब्ध पैकेजों और उनके संस्करणों की एकल सुसंगत सूची में संग्रहीत करता है package-archive-contents

पर package-install, Emacs केवल मूल संग्रह की परवाह किए बिना एक पैकेज के नवीनतम संस्करण को चुनेंगे। पैकेज उत्पत्ति के बारे में अधिक नियंत्रण के लिए, एमईएलपीए मेलपा पैकेज प्रदान करता है जो निर्दिष्ट अभिलेखागार से काले या सफेद रंग के पैकेज की अनुमति देता है।


2
यह S-uअधिक सटीक होना है।
लेनार होयट

@ mcb क्या है S-u? पैकेज मेनू उस बंधन का उपयोग नहीं करता है।
16

2
मुझे इससे मतलब Shift-uहै।
लेनार होयट

8
@mcb खैर, यही कारण है कि मैंने
ary

1
यह सिर्फ मेरे जैसे भ्रमित लोगों के लिए है जो यह सोचते हैं कि इसका मतलब है <kbd> U </ kbd>।
लेनार होयट

23

टर्मिनल में:

emacs

M-x list-packages

यह आपको * संकुल * बफर में डालता है

shift-u x

emacs आपसे (y / n) पूछेगा, अपडेट के लिए प्रतीक्षा करें

C-x k <ret>

यह * पैकेज * बफर को मार देगा और आपको वापस * खरोंच * पर लौटा देगा

C-x-C-c

यह emacs से बाहर निकलेगा, और आपको फिर से स्थानांतरित करेगा, लेकिन आपको डिबग करना होगा :(

emacs

मेरे 2 ¢


जब मुझे "U" टाइप किया गया तो मुझे "कोई आदेश निर्दिष्ट नहीं" या ऐसा कुछ मिला। दौड़ने के बाद M-x package-refresh-contents, इसने मुझे अपडेट के लिए सभी को चिह्नित करने के लिए "यू" टाइप करने के लिए प्रेरित किया, और फिर मैं अपडेट चलाने के लिए "x" टाइप करने में सक्षम था।
MrColes

2

यह jpkotta के उत्तर पर विस्तारित टिप्पणी का अधिक है।

यह एक समायोजन है जो मैं ऊपर jpkotta के उत्तर के लिए प्रयोग कर रहा हूं:

(setq n 0)                                  ; set n as 0
(dolist (pkg pkgs-2b-present)               ; for each pkg in list
  (unless (or                               ; unless
           (package-installed-p pkg)        ; pkg is installed or
           (assoc pkg                       ; pkg is in the archive list
                  package-archive-contents))
    (setq n (+ n 1))))                      ; add one to n
(when (> n 0)                               ; if n > 0, 
  (package-refresh-contents))               ; refresh packages

(प्रतिस्थापित करना (when (not package-archive-contents) (package-refresh-contents)))।

पैकेज-सूची मेरे उपयोग-मामले के लिए पर्याप्त रूप से अक्सर पर्याप्त ताज़ा नहीं थी।

अगर मेरी समस्या का अधिक कुशल समाधान है तो मैंने विचार नहीं किया है; सबसे पहले, मुझे यह देखना है कि क्या समस्या इस समायोजन से दूर हो जाती है।


मेरे जवाब में, package-archive-contentsकेवल तब ही ताज़ा किया जाता है जब वह मौजूद नहीं होता है। विचार यह है कि आप अपने .emacs.d को एक नई मशीन में कॉपी करते हैं और यह स्वचालित रूप से आपके सभी पैकेजों को स्थापित करता है, लेकिन इसके बाद आपको मैन्युअल रूप से अपडेट करना होगा। मैं हर दो सप्ताह में एक बार अपडेट करने की कोशिश करता हूं। मैं अनुमान लगा रहा हूं कि आपने अपनी सूची में एक पैकेज जोड़ा है, लेकिन आपके package-archive-contentsपास यह करने के लिए बहुत पुराना था?
jpkotta

@jpkotta, मेरे पास एक दोहरी बूट है, प्रत्येक ~/.emacs.d/elpa/संकुल के स्थान के लिए अपने डिफ़ॉल्ट का उपयोग कर रहा है। हालाँकि, आपके पैकेज-इंस्टॉलिंग-कोड का मेरा संस्करण "तीसरे" विभाजन में है, ( e:/emacs-configया /e/emacs-config/)। इसलिए मैं एक ओएस में रहते हुए सूची में एक पैकेज जोड़ता हूं, और Emacsदूसरे ओएस में लोड होने पर इसे अपडेट करना चाहिए । निश्चित रूप से मेरे समाधान में ओवरकिल का कुछ तत्व है, लेकिन यह कम से कम काम कर रहा है।
ब्रैडी ट्रेनर

@jpkotta, क्यों मुझे package-archive-contentsलग रहा था कि संभवत: इस तरह से बाहर निकलना मुझसे बच जाता है। यह एक ऐसा मुद्दा है जिसे मैंने संकुचित नहीं किया। अगर मैं भविष्य में "अधिक सुरुचिपूर्ण" समाधान ढूंढता हूं, तो मैं इसे अपनी पोस्ट में जोड़ दूंगा।
ब्रैडी ट्रेनर

1
(package-refresh-contents)को लिखता है ~/.emacs.d/elpa/archives। यह स्पष्ट नहीं है कि आपके पास वह निर्देशिका है जो OSes के बीच साझा की गई है। मैं elpa/निर्देशिकाओं को साझा करने की सलाह elpa/दूंगा , क्योंकि Emacs bytecode (कोड by bytecompiled) पीछे की ओर संगत नहीं है ( gnu.org/software/emacs/manual/html_node/elisp/… )। आपको यह सुनिश्चित करना होगा कि दोनों स्थापनाओं में Emacs का एक ही संस्करण हो। मैं अपने .emacs.dसंस्करण नियंत्रण में रखता हूं , और उसके साथ अलग-अलग संस्थापनों को सिंक्रनाइज़ करता हूं ।
jpkotta
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.