Package.el का उपयोग इंस्टॉल और अपडेट करने के लिए, लेकिन लोड करने और कॉन्फ़िगर करने के लिए उपयोग-पैकेज


15

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

मैं आमतौर पर सीखने में दिलचस्पी रखता हूं कि लोग सिस्टम के use-packageसाथ कैसे गठबंधन करते package.elहैं, लेकिन अधिक विशिष्ट प्रश्न के लिए, पढ़ना जारी रखें।

यहाँ मैं क्या चाहता हूँ:

  1. संकुल प्रबंधक द्वारा संकुल स्थापित करने के लिए ताकि मैं आसानी से संकुल ब्राउज़ कर सकूँ और उन्हें अद्यतन रख सकूँ list-packages
  2. पैकेजों को विशेष रूप से कॉन्फ़िगर और लोड करने के लिए use-package, इसलिए मैं आसानी से अपनी इनइट फ़ाइल में देख सकता हूं कि मैं क्या लोड कर रहा हूं और यह कैसे कॉन्फ़िगर किया गया है।
  3. वैकल्पिक रूप से, मैं भी माध्यम से संकुल स्थापित करने में सक्षम होना चाहते हैं use-packageके :ensureकीवर्ड।

अगर मैं सही ढंग से समझ रहा हूं तो मुझे बहुत कम चाहिए, जो package-initializeमूल रूप से केवल उसी तरीके से हो जो इसे स्थापित करता है load-path। वर्तमान में मेरे पास मेरे कॉन्फ़िगरेशन में यह है:

;(package-initialize)
(setq package-enable-at-startup nil)
(let ((default-directory "~/.emacs.d/elpa"))
  (normal-top-level-add-subdirs-to-load-path))
(require 'use-package)

पहली, टिप्पणी की गई, लाइन इतनी है Emacs 25 मदद नहीं करता (package-initialize)है मेरी init फ़ाइल में जोड़ें । के साथ बिट normal-top-level-add-subdirs-to-load-pathक्या package-initializeकरने के लिए load-pathएक सन्निकटन है, एक सन्निकटन कि काफी अच्छा लगता है।

यह मेरी इच्छाओं 1 और 2 को प्राप्त करने के लिए लगता है, लेकिन 3 नहीं। अगर मैं उपयोग करने की कोशिश करता :ensureहूं, तो मुझे एक त्रुटि संदेश मिलता है, जो कहता है कि package.elआरंभिक नहीं है। कॉल करने से package-initializeवह ठीक हो जाएगा, लेकिन मैं इससे बचना चाहता हूं क्योंकि a) मैं नहीं चाहता कि सभी असंख्य ऑटोलॉड्स लोड किए जाएं (मैं use-packageठीक-ठीक ऑटोलैड बनाने के लिए उपयोग करना पसंद करता हूं), और b) मैं आसानी से सक्षम होना चाहता हूं जब भी मैं चाहता हूं कि कुछ स्थापित पैकेजों को लोड करने से बचें (जो कि करना आसान है use-package)।

किसी को यह कैसे करना है के लिए एक सिफारिश है?

जवाबों:


11

IIUC जो आप करना चाहते हैं वह है:

(package-initialize t)

tतर्क पर ध्यान दें , जो आपकी खुशी की कुंजी है क्योंकि यह सभी स्थापित पैकेजों को सक्रिय किए बिना पैकेज (या कम से कम) को इनिशियलाइज़ कर देगा।


1
यह मेरे प्रश्न का उत्तर देता है, भले ही अब मैं इसका उपयोग करने की ओर झुक रहा हूं package-initializeजो मेरे प्रश्न को प्रस्तुत करता है।
उमर

15

अपने वर्तमान कॉन्फ़िगरेशन के साथ, आपने प्रभावी रूप से अक्षम किया है package.el, जैसा कि आप पैकेज मैनेजर को इनिशियलाइज़ नहीं करते हैं और Emacs को अपने आप इसे इनिशियलाइज़ करने से रोकते हैं। बदले में आप सभी को ELPA जोड़ना है load-path, लेकिन यह पैकेज क्या है का एक छोटा सबसेट है। मुझे यकीन नहीं है कि आप ऐसा क्यों करते हैं, लेकिन यह ऐसा सेटअप नहीं है जिसे मैं सुझाऊंगा।

विशेष रूप से, आपको अपने दृष्टिकोण के साथ पैकेज ऑटोलोड नहीं मिलेगा, जिसका अर्थ है कि शुरू में किसी भी पैकेज से कोई कमांड उपलब्ध नहीं होगा।

दूसरे शब्दों में, M-xकेवल आपको अंतर्निहित कमांड की पेशकश करेगा। अपने पैकेज से आदेशों को जोड़ने के लिए आपको अपनी सभी घोषणाओं में स्पष्ट :commandsपरिभाषाएं जोड़नी होंगी , जो रखरखाव के लिए बहुत प्रयास करते हैं - विशेष रूप से बड़े पैकेज जैसे कि मैगिट के लिए - अनिवार्य रूप से शून्य लाभ के लिए - पैकेज आपको मुफ्त में ऑटोलॉड देता है। ।use-package


Package.el के use-packageसाथ संयोजन वास्तव में बहुत सरल है - y संपूर्ण सेटअप इस संयोजन पर आधारित है - लेकिन यह पैकेज के लिए बेहतर है। अपनी init फ़ाइल के आरंभ में ही पैकेज पैकेज शुरू करें:

(require 'package)
(setq package-enable-at-startup nil)   ; To prevent initialising twice
(add-to-list 'package-archives '("melpa" . "https://stable.melpa.org/packages/"))

(package-initialize)

सुविधा के लिए आप बाद में बूटस्ट्रैप करना चाहते हैं use-package, अगर यह पहले से स्थापित नहीं है:

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

चलिए आप एक नए सिस्टम पर Emacs सेशन शुरू करते हैं, और आपका init.el अपने आप इंस्टॉल हो जाएगा use-package

अंततः आपको लोड करने की आवश्यकता है use-package:

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

अब आप use-packageसंकुल को संस्थापित और विन्यस्त करने के लिए उपयोग कर सकते हैं :

(use-package magit                      ; The one and only Git frontend
  :ensure t
  :bind (("C-c v c" . magit-clone)
         ("C-c v v" . magit-status)
         ("C-c v g" . magit-blame)
         ("C-c v l" . magit-log-buffer-file)
         ("C-c v p" . magit-pull))
   :config (setq magit-save-repository-buffers 'dontask))

जब Emacs अब स्टार्टअप के दौरान इस फॉर्म का मूल्यांकन करता है, तो use-packageयह जांच करेगा कि क्या मैगिट पहले से स्थापित है, और यदि आवश्यक हो तो स्वचालित रूप से इसे स्थापित करें।


3
"मुझे यकीन नहीं है कि आप ऐसा क्यों करते हैं": एकमात्र कारण जो मैं देख सकता हूं वह स्टार्टअप समय के बारे में है: package-initializeपथ को आबाद करने, ऑटोलॉड्स को परिभाषित करने और इसके बाकी सामान को करने के लिए कुछ समय लगता है। मुझे लगता है कि मैंने कहीं पढ़ा है कि जॉन विएगली खुद (लेखक के use-package) शस्त्रों use-packageपर भरोसा करने के बजाय सभी ऑटोलॉजेड आदेशों की घोषणा करना पसंद करते हैं package.el
फ्रांस्वा फ़ेवोटे सेप

पिछली बार जब मैंने देखा कि उसने package.el का उपयोग बिल्कुल नहीं किया है, और किसी भी मामले में, मुझे नहीं लगता कि आप बहुत कुछ हासिल करेंगे। आपको load-pathकिसी भी स्थिति में ऑटोलैड को जोड़ने और जोड़ने की आवश्यकता है , चाहे वह use-packageया उसके माध्यम से हो package.el। मुझे संदेह है कि एक औसत दर्जे का अंतर है, खासकर अगर आपको एक तेज़ डिस्क के साथ एक आधुनिक सिस्टम मिला है।
चंद्रग्रहण

3
माना। मैंने खुद टाइमिंग की। एक तेज डिस्क के साथ, आप प्रभावी रूप से ज्यादा अंतर नहीं देखते हैं। एक धीमी डिस्क के साथ, स्टार्टअप को package-initializeकस्टम सूची की तुलना में काफी धीमी (कुछ 0.2 की तरह) हो सकता है load-path। मैं इसे फाइलसिस्टम के "अन्वेषण" के लिए package.elकरता हूं जो करता है। हालाँकि, मैंने autoloadफाइलों से लोडिंग परिभाषाओं और उन्हें use-packageछंदों में होने के बीच प्रदर्शन में कोई महत्वपूर्ण अंतर नहीं मापा ।
फ्रांस्वा फेवोटे सेप

खैर, मैं यह नहीं कहूंगा कि मैंने सिस्टम को निष्क्रिय कर दिया package.elहै, मैं कहूंगा कि मैं केवल विकलांग हूं package-initialize! इसका कारण यह है कि जब मैं list-packagesनए पैकेजों के लिए ब्राउज़ करना पसंद करता हूं और विशेष रूप से अपने सभी वर्तमान में स्थापित पैकेजों को अपडेट करने के लिए, मुझे लगता है कि मैं लक्षित लोडिंग पसंद करता हूं use-package। मेरे लिए केवल कमांड के लिए ऑटोलोड होने से मैं एक अच्छी बात की तरह लगता है!
उमर

1
@ OmarAntolín-Camarena क्यों नहीं? ऑटोलॉड्स अनिवार्य रूप से एक उपयोगकर्ता-सामना करने वाले पैकेज का सार्वजनिक इंटरफ़ेस है, और चूंकि पैकेज। यह उन पैकेजों को वितरित करने का मानक तरीका बन गया जो हम उनकी उपस्थिति पर भरोसा कर सकते हैं।
चंद्रोदय
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.