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.