मुझे लोड-पथ पर प्रत्येक पैकेज को क्यों जोड़ना है? (या मेरी इनिट फ़ाइल में पैकेज की आवश्यकता के साथ समस्या)


17

हर बार जब मैं पैकेज मेनू से एक पैकेज स्थापित करता हूं, अगर मैं requireअपनी इनिट फ़ाइल में इसकी कोशिश करता हूं तो मुझे एक त्रुटि मिलती है जब तक कि मैं इसे लोड-पथ में मैन्युअल रूप से नहीं जोड़ता:

(add-to-list 'load-path "/home/nick/.emacs.d/elpa/use-package-20141220.1645")

(require 'use-package-autoloads)
(require 'use-package)

यह थकाऊ है। और आमतौर पर पैकेज पथ में संस्करण-संख्याएं होती हैं। यदि कोई पैकेज अपडेट किया गया था, तो मुझे लोड-पथ को मैन्युअल रूप से संपादित करना होगा।

क्या इसे स्वचालित करने का कोई तरीका है?

जवाबों:


23

टी एल; डॉ:

अपनी इनइट फ़ाइल के शीर्ष पर निम्न पंक्ति जोड़ें ( .emacs.d/init.elया .emacs):

(package-initialize)

स्पष्टीकरण

Emacs के रूप में उपयोग हो सकता है जो फ़ाइलों का अधिक बनाना user-init-fileनिश्चित रूप से सही दृष्टिकोण नहीं है। क्योंकि मैनुअल यह नहीं कहता है कि यदि कोई विवाद है, तो कम से कम आपके द्वारा उद्धृत किए गए भाग में नहीं है, यह सब भ्रम को जोड़ने के लिए है - अब हम नहीं जानते कि वास्तव में कौन सा है user-init-file(जिसका मूल्य आप चाहते हैं। पता लगाने के लिए निरीक्षण करना)।

इसलिए सभी उम्मीदवारों को हटाकर शुरू करें, ~/.emacs.d/init.elजिन्हें आम तौर पर पसंद किया जाता है (उपयोगकर्ताओं द्वारा) क्योंकि यह अपवित्र गंदगी में योगदान नहीं करता है $HOMEऔर यह सभी Emacs कॉन्फ़िगरेशन फ़ाइलों को रखने की अनुमति देता है, जिसमें सबसे महत्वपूर्ण एक सहित, संस्करण नियंत्रण के लिए केवल एक रिपॉजिटरी का उपयोग करना शामिल है Emacs।

उपयोगकर्ता की init फ़ाइल लोड package-initialize होने के बाद डिफ़ॉल्ट रूप से Emacs कॉल । यह ऐसा नहीं करता है सब पर है क्योंकि आजकल, सबसे उपयोगकर्ताओं का उपयोग कर अपने पैकेज इंस्टॉल package.elतो वे कुछ भी करने को लिए इन पैकेजों उपलब्ध कराया जाना नहीं होना चाहिए -।

दूसरी तरफ हर कोई ऐसा नहीं करता है, इसलिए कॉल करना संभव होना चाहिए package-initialize। उस फ़ंक्शन को कॉल करने से रोकना (setq package-enable-at-startup nil)उपयोगकर्ता के इनिट फ़ाइल (जहां आप इसे डाल सकते हैं?) को जोड़कर किया जाता है ।

package-initializeइससे पहले कि उपयोगकर्ता Emacs यह नहीं करने के लिए कहने के लिए एक परिवर्तन था, और इसलिए यह init फ़ाइल को लोड करने के बाद किया जाना है, तो उपयोगकर्ता को कॉल नहीं किया जा सकता है । जब तक उपयोगकर्ता केवल पैकेजों को स्थापित करता है और तब उनका उपयोग करता है-या कस्टम इंटरफ़ेस का उपयोग करके उन्हें कस्टमाइज़ करता है जो बस ठीक काम करता है। लेकिन अगर आप अपने पैकेजों को कस्टमाइज़ करना चाहते हैं, तो आपको यह सुनिश्चित करना होगा कि वे वास्तव में उन load-pathकार्यों का उपयोग करने से पहले हैं जो वे परिभाषित करते हैं।

यह करना बहुत आसान है और ठीक से प्रलेखित है (यदि मैंने पहले देखा था, तो मुझे ऊपर लिखे गए अधिकांश को नहीं लिखना होगा: - / /

Init फ़ाइल लोड करने के बाद स्वचालित पैकेज लोड होने का कारण यह है कि उपयोगकर्ता विकल्प केवल init फ़ाइल को लोड करने के बाद अपने अनुकूलित मान प्राप्त करते हैं, जिसमें उपयोगकर्ता विकल्प भी शामिल हैं जो पैकेजिंग सिस्टम को प्रभावित करते हैं। कुछ परिस्थितियों में, आप अपनी init फ़ाइल में स्पष्ट रूप से पैकेज लोड करना चाह सकते हैं (आमतौर पर क्योंकि आपकी init फ़ाइल में कुछ अन्य कोड पैकेज पर निर्भर करता है)। उस स्थिति में, आपकी init फ़ाइल को फ़ंक्शन को कॉल करना चाहिए package-initialize। यह सुनिश्चित करना है कि संबंधित उपयोगकर्ता विकल्प, जैसे कि package-load-list(नीचे देखें), package-initializeकॉल से पहले सेट किए गए हैं। आप यह भी तय करना चाहिए package-enable-at-startupकरने के लिएnilinit फ़ाइल को संसाधित करने के बाद दोबारा पैकेज लोड करने से बचने के लिए। वैकल्पिक रूप से, आप स्टार्टअप पर पैकेज लोडिंग को पूरी तरह से रोक सकते हैं, और मैन्युअल रूप से अपने पैकेज को लोड करने के लिए कमांड 'Mx पैकेज-इनिशियलाइज़' को लागू कर सकते हैं।

इसलिए:

;;; .emacs.d/init.el -- the `user-init-file'

(package-initialize)
(setq package-enable-at-startup nil)

(require 'use-package)

(use-package some-package
  :init (setq some-package-variable "foobar")

    ...

;;; .emacs.d/init.el ends here

बेशक समस्या (या एक अतिरिक्त समस्या) यह भी हो सकती है कि टाइपो Symbol's function definition is void: use-packgeआपकी इनिट फ़ाइल में है और ऐसा तब तक नहीं हुआ जब तक कि आपने इसे emacs.se में टाइप नहीं किया।


1
इसके अलावा stackoverflow.com/questions/11127109/…
phils

क्या (require 'use-package)पहले इस्तेमाल करना ठीक है (package-initialize)?
陳 陳

3

मुझे लगता है कि इस स्टैक ओवरफ्लो जवाबafter-init-hook में वर्णित समाधान का उल्लेख किया जाना चाहिए:

(defun my-packages-init ()
  (require 'some-great-package))

(add-hook 'after-init-hook 'my-packages-init)

मैंने सोचा था कि यह ऐसा तरीका था जिसे किया जाना चाहिए था, लेकिन अन्य उत्तर इसे करने के अन्य तरीकों की जानकारी प्रदान करते हैं।


0

निम्नलिखित ~/.emacs.d/site-lispलोड पथ के तहत सभी dirs जोड़ता है , तो आप सिर्फ requireपैकेज कर सकते हैं और आप कर रहे हैं:

(let* ((my-lisp-dir "~/.emacs.d/site-lisp/")
       (default-directory my-lisp-dir)
       (orig-load-path load-path))
  (setq load-path (cons my-lisp-dir nil))
  (normal-top-level-add-subdirs-to-load-path)
  (nconc load-path orig-load-path))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.