उपयोग-पैकेज में init और config के बीच अंतर


16

मेरा विन्यास इस तरह है:

(use-package html-mode
  :mode "\\.html\\'"
  :config
  (progn
    (add-hook 'html-mode-hook 'turn-off-auto-fill)))

अब जब मैं जाकर HTML फ़ाइल देखता हूं, तो मैं देखता हूं कि auto-fillयह बंद नहीं है। लेकिन अगर मैं :initइसके बजाय उपयोग करता हूं :config, तो auto-fillबंद हो जाता है। तो मेरा सवाल यह है कि आदेशों का :configनिष्पादन कब किया जाता है ?

जवाबों:


16

यदि पैकेज को स्थगित कर दिया जाता है, तो वे भिन्न होते हैं, अर्थात जब तक यह आवश्यक नहीं होता है तब तक लोड नहीं किया जाता है। उस :initसमय आपकी एमएसीएस फ़ाइल को पहली बार पढ़ने :configके समय निष्पादित किया जाएगा , लेकिन उस समय निष्पादित किया जाएगा जब पैकेज वास्तव में लोड होता है।

आपके उदाहरण में, modeपैकेज को लोड करने में निहित दोषों का उपयोग । आपने पहली बार html फ़ाइल देखी जाने पर पैकेज को लोड करने के लिए कॉन्फ़िगर किया है।

आप :demandयह सुनिश्चित करने के लिए उपयोग कर सकते हैं कि पैकेज को हमेशा स्टार्टअप पर लोड किया जाए, लेकिन अधिक संभावना है कि आप यहां क्या करना चाहते हैं, अपना हुक लगा दें :init

डॉकस्ट्रिंग से:

:init Code to run when `use-package' form evals.

जब से आप इसे अपने उपयोगकर्ता-इनिट फ़ाइल में डाल रहे हैं, तो मूल रूप से इसका मतलब है कि यह स्टार्टअप पर चलेगा।

:config Runs if and when package loads.

इसलिए, तब तक न चलाएं जब तक कि पैकेज वास्तव में लोड न हो जाए।

:defer Defer loading of package -- automatic if :commands, :bind, :bind*,  :mode or :interpreter are used.

उन चीजों की सूची नोट करें जो स्वचालित रूप से एक पैकेज को स्थगित कर देती हैं। मूल रूप से यदि आप use-packageउन स्थितियों को बताते हैं जिनमें आपको इस पैकेज की आवश्यकता होती है, तो यह मान लेता है कि आप इसे तब तक लोड नहीं करना चाहते जब तक कि वे स्थितियाँ उत्पन्न न हो जाएँ।

:demand Prevent deferred loading in all cases.

सुनिश्चित करें कि पैकेज स्टार्टअप पर लोड है, भले ही आपके द्वारा निर्दिष्ट अन्य विकल्पों की परवाह किए बिना।

अपडेट करें

हाल की टिप्पणियों के आधार पर इस पर फिर से गौर करना ... मैंने ऊपर जो कहा है वह सब सच है, लेकिन मुझे नहीं लगता कि यह सवाल का सही जवाब देता है। यहां मूल समस्या वास्तव html-modeमें पैकेज नहीं है, बल्कि पैकेज द्वारा परिभाषित एक विधा है sgml-mode। यह मेरे लिए उम्मीद के मुताबिक काम करता है:

(use-package sgml-mode
  :mode ("\\.html\\'" . html-mode)
  :config (add-hook 'html-mode-hook 'turn-off-auto-fill))

मूल उदाहरण में, :configअभिव्यक्ति का कभी भी मूल्यांकन नहीं किया जाता है क्योंकि पैकेज नाम का html-modeलोड कभी नहीं मिलता है। :initकाम करने के लिए समान अभिव्यक्ति को स्थानांतरित करना क्योंकि init कोड का हमेशा मूल्यांकन किया जाता है, चाहे पैकेज कभी भी लोड हो जाए।



@npostavs धन्यवाद, ध्यान देने योग्य है। मैं अभी तक 2.0-पैकेज का उपयोग करने के लिए खुद को स्थानांतरित नहीं किया है। एक बात के लिए, मैं :idleबहुत अधिक उपयोग करता हूं और ": बेकार को हटा दिया गया है" के प्रभाव में नहीं देखा गया है।
ग्लूकोज

1
मुझे अभी भी समझ में नहीं आया है, जब वह एक HTML फ़ाइल पर जाता है और लोड करने के लिए पैकेज को ट्रिगर करता है, तो उसे auto-fillबंद नहीं किया जाता है, अर्थात कॉन्फ़िगरेशन कोड नहीं चलता है। मेरी भी यही समस्या है।
केन विलियम्स

@ केनविलियम्स आपका मुद्दा html- मोड के साथ भी है? मुझे लगता है कि यहां वास्तविक समस्या यह है कि html-modeपैकेज नहीं है। कम से कम मेरे वर्तमान संस्करण Emacs html-modeमें, पैकेज में परिभाषित किया गया है sgml-mode। इसलिए यदि आप use-packageकुछ करना चाहते हैं जब एक पैकेज का नाम html-modeलोड किया जाता है तो कोड कभी नहीं चलता है क्योंकि ऐसा कोई पैकेज कभी भी लोड नहीं किया जाता है। आपको html-mode setup को एक में डालना होगा (use-package sgml-mode ....)
ग्लूकोज

क्षमा करें - मेरा मुद्दा साथ है org-mode, नहीं html-mode। एक समान मुद्दा यह है कि पैकेज को कहा जाता है org-mode, लेकिन ईएलपीए पैकेज कहा जाता है org। शायद वह इसे (या मुझे) भ्रमित कर रहा है?
केन विलियम्स

7

इस उदाहरण से मुझे :initऔर उनके बीच के अंतर को समझने में बहुत आसानी हुई :config। आइए ace-windowपैकेज का एक उदाहरण लें (लेकिन यह कोई भी पैकेज हो सकता है)। इसे अपनी init.elफ़ाइल में रखें :

(use-package ace-window
  :ensure t
  :defer t
  :config
  (progn
    (message "ace window: hello world")))

अब अपने emacs खोलें और *Messages*बफ़र में देखें कि क्या कोई hello worldसंदेश है। आप कोई भी खोज नहीं कर पाएंगे क्योंकि पैकेज स्थगित है। अब इसमें से परिवर्तन configकरें init:

(use-package ace-window
  :ensure t
  :defer t
  :init
  (progn
    (message "ace window: hello world")))

अब बंद करें और फिर से खोलें और *Messages*बफर का निरीक्षण करें । आपको संदेश दिखाई देगा ace window: hello worldक्योंकि कोड चलाए जाने पर कोई बात नहीं है :init। इसके मामले में configकेवल तभी चलाया जाएगा जब उस पैकेज को लोड किया जाएगा।


यह मदद करता है, बस एक पक्ष का सवाल है, फिर क्या अंतर है खोजशब्द :initऔर :prefaceआपके उदाहरण के आधार पर?
डॉक्टरेट

@doctorate: :prefaceतब भी चलाया जाता है, जब प्रश्न में पैकेज अक्षम हो, जबकि :initकेवल तभी चलाया जाता है जब पैकेज सक्षम होता है।
bbenne10
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.