विम: चलो और सेट के बीच अंतर क्या है?


145

letऔर setविम संपादक में क्या अंतर है ?

मुझे हमेशा आश्चर्य होता है कि दोनों का अस्तित्व क्यों है?

इसके अलावा, मुझे इसकी ऐतिहासिक पृष्ठभूमि सुनने में दिलचस्पी होगी।


15
आप का प्रयास किया था :help setऔर :help letऔर मैनुअल पढ़ा है?
9

5
हाँ, मैंने ऐसा किया है, लेकिन मुझे अभी भी नहीं पता है कि सेट का अस्तित्व क्यों है, क्योंकि वही चीजें करते हैं।
डेव हाल्टर

1
@ दाविदाल्टर: letएक ही काम नहीं करता है। ऐसी चीजें हैं जिन्हें आप प्राप्त नहीं कर सकते setहैं जो letमेरे साथ संभव हैं , मेरा उत्तर देखें।
रेने Nyffenegger

4
setlocalअभी तक किसी ने उल्लेख नहीं किया है ... वे &l:*चर के बराबर हैं ।
क्रिस मॉर्गन

1
@VictorZamanian: बूलियन सेटिंग्स के लिए, यह यकीनन सिर्फ set noicया के लिए आसान है set ic। जहाँ तक मुझे पता है, setभी साथ संगत है viजो let, के रूप में मुझे लगता है , नहीं है।
रेने न्यफेनेगर

जवाबों:


144

:setस्थापित करने के लिए है विकल्प , :letएक करने के लिए एक मूल्य निर्दिष्ट करने के लिए चर

ऐसा होता है कि एक विकल्प के लिए मूल्य एक विकल्प के नाम से जुड़ा हुआ है &(जो &option-nameनिर्माण तब "साधारण" चर के समान होता है)। तो, निम्नलिखित समतुल्य हैं:

:set  tw=40
:let &tw=40

लेकिन, उदाहरण के लिए, वैश्विक चर फू ( :let g:foo=50) को 50 असाइन करना एक :setकमांड के साथ प्राप्त नहीं किया जा सकता है (क्योंकि जी: फू एक चर है और विकल्प नहीं है)।

कुछ विकल्प बूलियन जैसे हैं। इन्हें सेट करते समय, कोई मान आवश्यक नहीं है (जैसा कि ( :set noicऔर इसके विपरीत :set ic))।


22

सेट एक अधिक उपयोगकर्ता के अनुकूल इंटरफेस है जो विकल्पों के लिए विशेष है

उदाहरण के लिए

:verbose set

प्रभाव में सभी विकल्पों को प्रदर्शित करने के लिए।

:set tw=40

के लिए एक आशुलिपि के रूप में काम करेगा set textwidth=40

:set wrap&

विकल्प के लिए डिफ़ॉल्ट मान सेट करेगाwrap

:set nowrap

विकल्प को अनसेट कर देगा

:set wrap!

विकल्प को टॉगल करेगा

सबसे महत्वपूर्ण बात,

:setTab # टैब पूरा करने के लिए!

उपरोक्त कुछ (आसानी से) प्राप्त किया जा सकता है let


पुनः:, :set nowrapOptions.txt (: help set-option) कहता है:: se [t] {विकल्प} टॉगल विकल्प: सेट, स्विच ऑन करें। संख्या विकल्प: मूल्य दिखाएं। स्ट्रिंग विकल्प: मूल्य दिखाएं। जब आप कहते हैं, तो आप इस बात से सहमत नहीं हैं कि जब आप 'ऑप्शन रैप के लिए डिफ़ॉल्ट मान सेट करेंगे'। ??
अण्डाकार दृश्य

@Ellipticalview मैं थोड़ा भ्रमित हूँ। आप दस्तावेज़ के कुछ भाग उद्धृत कर रहे हैं। यदि आप पूरी बात पढ़ते हैं तो आप पाएंगे कि यह मेरे सभी मामलों से सहमत है। [नोट: no-सुपरक्षित विकल्प भ्रामक हो सकते हैं। यह भी ध्यान option&पीछे है &कि संभवतः आपसे छूटे]।
sehe

12

:setकेवल विकल्पों के साथ काम करता है, और सेह के उत्तर कुछ अच्छे उपयोग के उदाहरण दिखाते हैं।

:letदूसरी ओर लगभग सब कुछ कर :setसकता है जो कर सकता है, और अधिक। यह एक मान प्रदान कर सकता है

  • एक चर, उदाहरण के लिए let vi = 'vim'
  • एक विकल्प, उदाहरण के लिए let &tw = 40
  • एक रजिस्टर, उदा let @a = $HOME . '/vimfiles'
  • एक पर्यावरण चर, उदाहरण के लिए; let $NOTHING = 'NOTHING'

एक और बड़ा अंतर यह है कि दाहिने हाथ की तरफ :letएक अभिव्यक्ति है , जिसका अर्थ है कि आप स्ट्रिंग कॉन्फैटिनेशन (जैसा कि ऊपर मेरे रजिस्टर उदाहरण में देखा गया है) और अंकगणितीय संचालन (जैसे let &tw = 40 + 60) कर सकते हैं। इसका मतलब यह भी है कि अगर यह एक तार है तो आपको मूल्य को उद्धृत करना होगा। :setदूसरी ओर मूल्य शब्दशः पढ़ता है।

:setविकल्पों में से इसका उपयोग करना आसान है , हालांकि :letइसमें से अधिकांश भी कर सकते हैं, यहाँ कुछ उदाहरणों का उपयोग करते हुए तुलना की गई है ("n / a" का अर्थ है इसे करने का कोई तरीका नहीं :let)

  • :verbose set बनाम n / a (सभी विकल्पों को सूचीबद्ध करने का एक और तरीका नहीं है)
  • :set tw=40बनाम :let &tw = 40(हाँ, आप उसी शॉर्टहैंड का letभी उपयोग कर सकते हैं )
  • :set wrap& बनाम एन / ए
  • :set nowrapबनाम :let &wrap = 0(बूलियन विकल्पों के लिए, 0 गलत है और 1 सच है)
  • :set wrap! बनाम :let &wrap = !&wrap

कुछ और उदाहरण

  • एक विकल्प का मूल्य प्रिंट करें: :set formatoptions?बनाम :echo &formatoptions( letमान प्रिंट नहीं करता है, इसके विपरीत set)
  • एक ही समय में कई विकल्पों को असाइन करना:

    :set et sw=4 sts=4 
    

    बनाम

    :let [&et, &sw, &sts] = [0, 4, 4]
    
  • वैश्विक विकल्प सेट करें: setglobal etबनामlet &g:et = 1

  • स्थानीय विकल्प सेट करें: setlocal etबनामlet &l:et = 1

देखें :h :setऔर :h :letअधिक जानकारी के लिए


tl; डॉ

:setकेवल विकल्पों के साथ काम करता है लेकिन वाक्यविन्यास बहुत सरल है। :letन केवल विकल्पों के साथ, बल्कि चर, रजिस्टर और पर्यावरण चर भी काम करता है। इसके विपरीत :set, दाहिने हाथ की ओर :letएक अभिव्यक्ति है।


10

लोगों ने इसके बारे में जो कुछ भी लिखा है :let, उस पर विस्तार करते हुए , मैंने देखा है कि इसका उपयोग किसी विकल्प के लिए एक चर में मान प्रदान करने के लिए किया जा सकता है, कुछ :setनहीं कर सकता। उदाहरण के लिए, यह फ़ंक्शन letवैश्विक वैरिएबल में मान orig_twको textwidthविकल्प पर असाइन करने के लिए उपयोग करता है :

" Toggle Autowrap
" Default of 72 but can be overridden by tw settings in other vimrc files
let g:orig_tw = 72
function Toggle_autowrap_mode()
    if &textwidth == 0
        " Must use let instead of set here in order for g:orig_tw to be
        " evaluated properly
        let &textwidth = g:orig_tw
        echo "Autowrap mode on tw=" . &textwidth
    else
        let g:orig_tw = &textwidth
        set textwidth=0
        echo "Autowrap mode off tw=" . &textwidth
    endif
endfunction

noremap _A :call Toggle_autowrap_mode()<CR>

सारांश: let एक विकल्प के लिए एक चर असाइन करने के लिए अनुमति देता है: let &textwidth = g:orig_twऔर इसके विपरीत।
सर्ज स्ट्रोबंड्ट 10

2

यह बहुत सरल है।
जैसा कि लोगों ने कहा setहै कि सीमा के कारण विकल्प और काम बेहतर है। यह भी setऐतिहासिक आदेश है कि सभी संस्करण viअपने विकल्पों को सेट करने के लिए उपयोग करते हैं। अधिकांश (सभी?) के अन्य संस्करण viनहीं हैं let

लेकिन संभवतः सबसे महत्वपूर्ण यह है कि जब आप संकलित करते हैं , तो setसभी संस्करणों पर काम करता है । मानक और बनाता है।vimletvimtinysmall

यदि यह याद आ रही letहै तो आपको त्रुटि देता है:
E319: Sorry, the command is not available in this version

नोट: ifऔर endifनहीं में या तो लागू किया जाता है vim.tinyलेकिन इस मामले में आदेशों एक त्रुटि, बजाय दो आदेशों के बीच सब कुछ शामिल है को छोड़ दिया जाता है देना नहीं है else

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.