Custom.el के बजाय setq के साथ चर सेट करने के लाभ?


69

मुझे बहुत से लोग (विस्तार लेखक और अन्य) विन्यास उदाहरण देते हैं setq:

(setq foo 'bar)

इन मापदंडों को अक्सर परिभाषित किया जाता है defcustom, जिससे वे अनुकूलन के लिए उपलब्ध होते हैं custom.el

मैं आमतौर पर custom.elउन्हें सेट करने के लिए उपयोग करता हूं। setqइसके बजाय उपयोग करने के लिए कोई फायदा होगा या दो तरीके लगभग समान हैं?

जवाबों:


85

कुछ लोग सोच सकते हैं कि इसका उपयोग करना सरल है setq। कुछ लोग सोच सकते हैं कि यह अधिक लिस्पी है। वास्तव में, यह सामान्य मामले में अनुभवहीन है।

यह सच है कि कुछ उपयोगकर्ता विकल्पों के लिए यह कोई मायने नहीं रखता है। लेकिन दूसरों के लिए, यह मायने रखता है, और setqउन विकल्पों के लिए गलत दृष्टिकोण है। तो एक सामान्य नियम के रूप setqमें, गलत दृष्टिकोण है।

यदि आप उपयोग करते हैं custom-set-variablesया customize-set-variableइसके बजाय setq, या यदि आप अनुकूलित उपयोगकर्ता इंटरफ़ेस (जैसे M-x customize-option) का उपयोग करते हैं , तो आप सुनिश्चित हैं कि विकल्प मान के लिए आवश्यक किसी भी प्रारंभिक आरंभीकरण या अद्यतन कोड को स्वचालित रूप से ट्रिगर किया जाएगा और आवश्यकतानुसार चलाया जाएगा। यदि आप उपयोग करते हैं setq, तो यह नहीं किया जाएगा।

अब, यह भी मामला है कि सबसे अधिक उपयोगकर्ता विकल्प, उनमें से विशेष रूप से कई 3rd पक्ष के पुस्तकालयों के लिए लिखा है, का उपयोग नहीं करते है defcustomकीवर्ड :setऔर :initialize, और का उपयोग कर setqउनके लिए कोई फर्क नहीं पड़ता। लेकिन बहुत सारे वेनिला एमएसीएस विकल्प ऐसे कीवर्ड का उपयोग करते हैं, और जो ऐसा करते हैं, उनके setqलिए यह सही बात नहीं है। इसलिए यदि आप अपने विकल्पों को सेट करने के लिए Lisp कोड का उपयोग करना चाहते हैं, न कि कस्टमाइज़ यूआई का, तो आप इसका उपयोग करने के बजाय custom-set-variablesया बंद करना बेहतर customize-set-variableसमझते हैं setq। यह कभी दर्द नहीं करता है और यह कभी-कभी मदद करता है (बहुत)।

लेकिन मैं इन दोनों चीजों को करने की सलाह देता हूं:

  • इसके लिए लिस्प कोड लिखने के बजाय कस्टमाइज़ यूआई का उपयोग करें

  • वेरिएबल को डिफाइन करेंcustom-file , ताकि कस्टमाइज उस फाइल पर कस्टमाइजेशन लिखे और आपकी इनिट फाइल ( ~/.emacs) में नहीं। IOW, अपने हाथ से लिखे गए आरंभीकरण कोड को कस्टमाइज़ द्वारा लिखे गए स्वचालित कोड से अलग रखें।


5
मुझे लगता है कि यह ध्यान देने योग्य है: यहां तक ​​कि: सेट और: मापदंडों को इनिशियलाइज़ करना, अगर पैकेज लोड होने से पहले यह पढ़ा जाता है तो भी सेटक काम करता है।
मालाबार

2
@Willyfrog आप इसे अपडाउन कर सकते हैं!
ज़ेन शेल्बी

17
उस आकर्षित के बारे में निश्चित नहीं है। संपूर्ण अनुकूलित चीज़ बल्कि जटिल है। इसके बिना, emacs प्रणाली बहुत सरल है। कस्टमाइज्ड एक ऐसी परत है, जो एलिस्प के साथ बिल्कुल ठीक नहीं है। एक बात के लिए, यह वर्णमाला के सभी संस्करणों का आदेश देता है। इसके अलावा, कई अनुकूलन चर (जैसे हुक, कुंजी) के बारे में नहीं हैं इसलिए अनुकूलित का उपयोग नहीं कर सकते हैं। इसलिए आपके पास वैसे भी मैनुअल एलिसपी कोड की स्थिति है।
Xah ली

4
@XahLee। खैर, मुझे यकीन है। ;-) लेकिन हाँ, अनुकूलित करें कि यह क्या है। यह कुंजी, हुक, फॉन्ट-लॉक कीवर्ड, डिस्प्ले टेबल आदि के लिए सबसे अच्छी बात नहीं है, लेकिन यह क्या करता है (विकल्प और चेहरे), यह बहुत अच्छा करता है। ऐसा नहीं है कि यूआई अद्भुत है, लेकिन ट्रिगर्स, टाइप-चेकिंग, आदि की हैंडलिंग मददगार है। मैं भी इच्छा प्रोग्रामर सकता है (वैकल्पिक) चीजों की तरह उपयोग करने :typeके साथ defvar- मुझे नहीं लगता कि यह उपयोगकर्ता विकल्पों के सीमित किया जाना चाहिए है। दुर्भाग्य से, कई प्रोग्रामर उनके उपयोग में आलसी हैं :type, और परिणाम बहुत उपयोगी नहीं है (यह कस्टमाइज़ की गलती नहीं है)।
ड्रू

1
डेटा बिंदु: एक वर्ष के बेहतर हिस्से में विकसित एमएसीएस इनिट कोड की मेरी 3,300 पंक्तियों में, मुझे बिल्कुल एक बार के setqबजाय उपयोग करके काट लिया गया है customize-set-variable। (यह एक समय के लिए था auto-revert-interval, और मुझे बाद में एहसास हुआ कि लोड करने setq से पहले उपयोग करना autorevertवास्तव में उपयोग करने की तुलना में बहुत तेज था customize-set-variable।)
राडोन रोसबोरो

37

मैं कई कारणों setqसे पसंद करता हूं customize:

  1. सबसे पहले और सबसे महत्वपूर्ण, यह चर को प्रोग्रामेटिक रूप से सेट करने की अनुमति देता है (जैसा कि, (setq foo (calculate-foo)))। मैं अपने कॉन्फ़िगरेशन में हर समय इस शक्ति का उपयोग चीजों को रखने के लिए करता हूं। मेरे लिए, Emacs का उपयोग करने का पूरा बिंदु प्रोग्रामैबिलिटी है, और customizeइंटरफ़ेस कुछ भी नहीं करता है लेकिन रास्ते में मिलता है।
  2. setqसंस्करण नियंत्रण और कोड संगठन के लिए बेहतर है। मैंने दर्जनों फाइलों के बीच अपने इनिशियलाइज़ेशन को विभाजित किया; यदि सब कुछ एक विशाल custom.elफ़ाइल में था, तो सेटिंग्स को जल्दी से ढूंढना और संपादित करना बहुत कठिन होगा।
  3. यह व्यक्तिपरक है, लेकिन मेरे लिए पूरे customizeइंटरफ़ेस को 90 के दशक के सबसे खराब यूआई से एक भयानक अवशेष की तरह लगता है। मैं किसी भी दिन Emacs की शक्ति के साथ पाठ संपादित करना पसंद करूंगा।

@ ड्रू कुछ सूक्ष्मता के साथ :setऔर के बारे में कुछ अच्छे बिंदु बनाता है :initialize। मैं वर्षों से Emacs का उपयोग कर रहा हूं और शायद ही कभी इस तरह की समस्याओं का सामना किया हो। जब मैं करते हैं, इसे बाहर स्वैप करने के लिए आसान है setqके लिए custom-set-variableविशिष्ट मामलों में।


10
1. आप प्रोग्राम के साथ अनुकूलित चर सेट कर सकते हैं customize-set-variable(s), और इससे बेहतर है कि ट्रिगर्स वे अपने आप चलते हैं। 2. आप अलग-अलग पदानुक्रमों में अपने सभी सेट और / या सहेजे गए चर देखने के लिए विभिन्न अनुकूलित कमांड का उपयोग कर सकते हैं, इसलिए आपको संस्करण नियंत्रण में अलग-अलग फ़ाइलों का उपयोग किए बिना स्वचालित रूप से विभिन्न समूहों का संगठन मिलता है। 3. यह बहुत बेहतर हो गया है। यदि आप UI पसंद नहीं करते हैं, तो आप अभी भी कस्टमाइज्ड और इंटरएक्टिव कमांड्स के माध्यम से कस्टमाइज्ड कमांड का उपयोग कर सकते हैं, जो कि कस्टमाइज्ड मोड से बचने के लिए कस्टमाइज्ड का उपयोग करने के अन्य सभी लाभों को प्राप्त करता है।
निक मैककरी

23

पठनीयता के setqबजाय उपयोग करने का एक फायदा customizeहै। प्रत्येक व्यक्ति को पसंद करने के लिए प्रत्येक अनुकूलन को एनोटेट करने के लिए स्वतंत्र है जो IMO पठनीयता में सुधार करता है। व्यक्ति समूह से संबंधित अनुकूलन भी कर सकता है जो प्रतिरूपकता में सुधार करता है। अंत में, मैं यह दलील दूंगा कि एक क्विक बफर के माध्यम से नेविगेट करना अधिक "आसान" है, फिर कस्टमाइज़ किए गए UI और विजेट्स को नेविगेट करना।

दूसरी ओर, अनुकूलित करने से आप आसानी से डिफ़ॉल्ट मानों पर वापस लौट सकते हैं जो कि चीजों के घटिया होने पर अनमोल हो सकते हैं।

EDIT: ड्रू का उत्तर उपयोग करने का एक शानदार कारण प्रदान करता है customize-set-variablesजो मेरे द्वारा बताए गए सभी फायदे प्रदान कर सकता है। हालाँकि, कस्टमाइज़ यूआई खुद को अलग-अलग प्लेटफार्मों के बीच पोर्टेबल कॉन्फ़िगरेशन के लिए उधार नहीं देता है जितनी आसानी से कच्ची एलिसा करता है। यदि आपको ओएस पर निर्भर सेटिंग के लिए एक चर की आवश्यकता है, तो आपको कई मामलों में कमाना होगा। एलिफ़ बफ़र्स में आसान नेविगेशन के बारे में मेरी बात अभी भी कायम है।


आप डिफ़ॉल्ट मान के साथ भी वापस लौट सकते हैं setq, बस setqलाइन पर टिप्पणी करें और emacs को पुनरारंभ करें।
टी। वेरॉन

3
हां, लेकिन कस्टमाइज़ बिना pesky पुनरारंभ किए बिना वापस लौट सकते हैं। नई सेटिंग्स आज़माने के लिए अत्यधिक उपयोगी है।
वम्सी

2
एनोटेशन के बारे में, कस्टमाइज़ किया गया इंटरफ़ेस आपको प्रत्येक परिवर्तन के लिए एक टिप्पणी जोड़ने की अनुमति देता है।
एंड्रयू स्वान

custom-set-variables है "कच्चे elisp", और मैं इसे कई मशीनों पर हर दिन का उपयोग करें। बस इसे उस जगह से बाहर कॉपी करें जहां अनुकूलित इसे लिखता है (यदि आपने इसे स्वयं नहीं लिखा है)।
क्रोड लैंगशान

<Kbd> Mx अनुकूलित - * </ kbd> इंटरफ़ेस में एक "टिप्पणी" फ़ील्ड है जो एक चर के साथ एक टिप्पणी संग्रहीत करने की अनुमति देता है।
kdb

-1

एक अन्य विकल्प जॉन विएगले के उपयोग-पैकेज का उपयोग करना है । यह उन पैकेजों को कॉन्फ़िगर करने के लिए प्रोग्रामेटिक तरीका प्रदान करता है जो एमएसीएस 24+ पैकेज आरंभीकरण प्रक्रिया के साथ अच्छी तरह से खेलते हैं। यहाँ readme से उपयोग का एक उदाहरण है:

(use-package color-moccur
  :commands (isearch-moccur isearch-all)
  :bind (("M-s O" . moccur)
         :map isearch-mode-map
         ("M-o" . isearch-moccur)
         ("M-O" . isearch-moccur-all))
  :custom (isearch-lazy-highlight t)
  :config (use-package moccur-edit))

मुद्दा यह है कि उपयोग पैकेज एक मैक्रो है और तुरंत इसके तर्कों का मूल्यांकन नहीं करता है। :initऔर :configमापदंडों प्रारंभ प्रक्रिया के विभिन्न चरणों में मूल्यांकन किया जाता है, यह संभव है एक ही स्थान पर प्रत्येक पैकेज के विन्यास है, लेकिन प्रत्येक भाग प्रारंभ की उचित स्तर पर निष्पादित करने के लिए बना रही है।

use-packageकुछ पैकेजों की तरह कुछ के बिना जाने के लिए उनके इनिशियलाइज़ेशन कोड के हिस्से की आवश्यकता होती है (package-initialize)और बाद में जाने के लिए दूसरे भाग की। यदि आपके पास उस तरह के कई पेकेगस हैं, तो आइर इनिशियलाइज़ेशन को इंटरलेय करना होगा।

इसका एक और लाभ use-packageयह है कि यदि आप आपको एक नई मशीन पर ले जाते हैं या यदि आप किसी अन्य उपयोगकर्ता के साथ अपने कॉन्फ़िगरेशन को साझा करते हैं, तो यह पैकेज से उपयोग करके स्वचालित रूप से लापता पैकेज स्थापित कर सकता है। पैकेज को वास्तव में लोड किए जाने तक सभी प्रारंभ को स्थगित किया जा सकता है।

अतिरिक्त कीवर्ड तर्क भी हैं जो आरंभीकरण प्रक्रिया पर अधिक नियंत्रण की अनुमति देते हैं।

सभी ने कहा, अनुकूलित का एक बड़ा फायदा यह है कि यह आपको दिखाता है कि किसी भी पैकेज में क्या कॉन्फ़िगर किया जाना है। यही कारण है कि मैं अभी भी अपने कई पैकेजों के लिए इसका उपयोग करता हूं।


2
यह वास्तव में सवाल का जवाब नहीं है। आपके बहुत ही जवाब में, आप बिना किसी स्पष्टीकरण के सेटक का उपयोग करते हैं।
जे डेविड स्मिथ

3
मुझे लगता use-packageहै कि खुद को संशोधित कॉन्फ़िगरेशन के फायदे मिलते हैं, और एक ही स्थान पर संकुल को आयात और कॉन्फ़िगर करना भी। लेकिन हां, उदाहरण का उपयोग करना setq। यह बस के रूप में अच्छी तरह से customize-set-variableयहाँ इस्तेमाल कर सकते हैं? मुझे यकीन नहीं है। क्या हमें इसके लिए (या customize-set-value) स्वैप करना चाहिए setq?
माइक

4
कृपया :customकीवर्ड का उपयोग करने के लिए उदाहरण बदलें ।
तून क्ले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.