Emacs Lisp में setq और setq-default के बीच का अंतर


89

मेरे पास Emacs Lisp के बारे में एक सवाल है। सेटक और सेटक-डिफॉल्ट में क्या अंतर है ?

ट्यूटोरियल कहते हैं कि सेटक स्थानीय बफ़र में प्रभावी होता है जबकि सेट -डिफ़ॉल्ट सभी बफ़र्स को प्रभावित करता है।

उदाहरण के लिए, यदि मैंने init.el में लिखा (सेट-ए-वेर-ए-वैर-वैल्यू) लिखा है, तो मुझे एमएसीएस शुरू करने और एक नया बफर खोलने के बाद मिला, ए-वेर भी है और इसका मान ए-वेरिएस-वैल्यू है । मुझे लगा कि यह वहाँ नहीं होना चाहिए था। ऐसा लगता है कि सेटक और सेटक-डिफॉल्ट में कोई अंतर नहीं है ।

क्या मेरी समझ में कुछ गड़बड़ है?

उदाहरण के लिए:

  1. मैंने init.el फ़ाइल में (setq hello 123) लिखा है , और मैं शेल में emacs abuffer चलाता हूं, फिर मैं "hello Cx Ce" इनपुट करता हूं , यह "123" दिखाता है। ऐसा ही तब होता है जब मैं सभी नए बफ़र्स में इसे चलाता हूं।

  2. मैंने init.el फ़ाइल में सेट (टैब टैब-चौड़ाई 4) लिखा है । जब मैं टैब-चौड़ाई Cx Ce चलाते हैं , तो यह "8" (वर्तमान मोड 'पाठ') दिखाता है। हालांकि, जब मैं उपयोग करता हूं (सेट-डिफॉल्ट टैब-चौड़ाई 4) , तो यह "4" दिखाता है। मैं इस घटना की व्याख्या नहीं कर सकता।

जवाबों:


100

Emacs में कुछ चर "बफर-लोकल" हैं, जिसका अर्थ है कि प्रत्येक बफ़र को उस वैरिएबल के लिए एक अलग मान रखने की अनुमति है जो वैश्विक डिफ़ॉल्ट को ओवरराइड करता है। tab-widthएक बफर-स्थानीय चर का एक अच्छा उदाहरण है।

यदि कोई चर बफ़र-स्थानीय है, तो setqवर्तमान बफ़र में उसका स्थानीय मान setq-defaultसेट करता है और वैश्विक डिफ़ॉल्ट मान सेट करता है।

एक चर बफ़र-स्थानीय नहीं है, तो फिर setqऔर setq-defaultएक ही बात करते हैं।

आपके मामले में 2, वर्तमान बफर में (setq tab-width 4)बफर-स्थानीय मान tab-width4 से 4 पर सेट करें , फिर भी वैश्विक डिफ़ॉल्ट मान tab-width8 पर छोड़ता है , इसलिए जब आपने tab-widthएक अलग बफर में मूल्यांकन किया जिसका कोई स्थानीय मूल्य नहीं था, तो आपने देखा कि 8. फिर। जब आप डिफ़ॉल्ट मान को 4 पर सेट करते हैं, तो उस बफर ने उसे उठाया, क्योंकि उसका अभी भी कोई स्थानीय मूल्य नहीं था।


जब मैं (टैब-चौड़ाई 4 सेट करता हूं), और इसका मूल्यांकन करता हूं, तो यह हर बफर में हमेशा 8 होता है। मुझे पता नहीं क्यों। लगता है इसका असर नहीं होता। लेकिन जब मैं उपयोग करता हूं (सेट-डिफ़ॉल्ट टैब-चौड़ाई 4), तो यह हर बफर में प्रभावी होता है। मुझे यह भी पता नहीं है कि क्यों :(
— ruanhao

(setq tab-width 4)उस बफर में प्रभावी होता है जहाँ आपने अभिव्यक्ति का मूल्यांकन किया था; यदि आप *scratch*बफर में इसका मूल्यांकन करते हैं तो उस बफर में इसके मूल्य की जांच करें।
— ट्रिपलए

tab-widthएक बफर-लोकल वैरिएबल है। इसलिए जब आप (setq tab-width 4), यह वर्तमान बफर में केवल 4 पर सेट है। अन्य सभी बफ़र्स tab-widthवैश्विक डिफ़ॉल्ट को बनाए रखते हैं , 8. जब आप (setq-default tab-width 4), आप वैश्विक डिफ़ॉल्ट tab-widthको 4 में बदल रहे हैं , तो अब हर बफर जो tab-widthस्वयं को परिभाषित नहीं किया है, वह नया डिफ़ॉल्ट है।
— dfan

3
हाँ। Startup में Emacs के अनुक्रम की क्रिया की सूची देखें । Init फ़ाइल पढ़ना चरण 12 है, और प्रारंभिक बफर को ऊपर लाना चरण 23 है।
— dfan

1
@ruanhao यदि आप (inq.el में टैब-चौड़ाई 4) सेट करते हैं, तो यह केवल उस बफर (init.el) पर लागू होगा। यदि आप चाहते हैं कि यह परिवर्तन सभी नए बफ़र्स पर लागू हो, तो (सेट-डिफ़ॉल्ट टैब-चौड़ाई 4) इसे पूरा करेगा। इसके अतिरिक्त, यदि आप किसी विशिष्ट प्रकार की फ़ाइल के लिए कोई मोड बनाना चाहते हैं, तो आप संभवतः (डिफ़ॉल्ट टैब-चौड़ाई 4) का उपयोग करना चाहेंगे ताकि वैश्विक डिफ़ॉल्ट को ओवरराइड न किया जा सके।
— हेम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.