विम में टैब बनाम अंतरिक्ष प्राथमिकताएं


87

जब टैब Vs. पर आता है तो विम बहुत मिलनसार होता है अंतरिक्ष प्राथमिकताएं। जैसा कि मैंने इसे समझा, tabstopसेटिंग एक टैब वर्ण की चौड़ाई को इंगित करता है। shiftwidthसेटिंग निर्दिष्ट कितने कॉलम के लिए वेतन वृद्धि / कमी का उपयोग करते समय <<और >>, आदेशों जबकि softtabstopसेटिंग को प्रभावित करती है खाली स्थान के की राशि सम्मिलित करने के लिए जब आप प्रेस Tabडालने मोड में कुंजी। यदि expandtabचालू है, तो टैब कुंजी softtabstopअंतरिक्ष वर्णों की संख्या सम्मिलित करती है । जबकि expandtabस्विच ऑफ के साथ , Tabकुंजी दबाने से टैब + स्पेस वर्णों की एक छोटी से छोटी संभावित संख्या मिलती है जो मेल खाती है softtabstop। (मुझे सही जवाब दो अगर मैं गलत हूँ।)

यह अंतिम बिंदु मुझे आश्चर्यचकित करता है: क्या कोई व्यावहारिक मामला है जहां आप नहीं चाहेंगे shiftwidth == tabstop && tabstop == softtabstop? मैं एक के बारे में सोच भी नहीं सकता। जहां तक ​​मेरा सवाल है, यह सबसे सुविधाजनक होगा अगर मैं इन तीनों को एक ही असाइनमेंट में एक ही मूल्य पर सेट कर सकूं। उदा कॉलिंग:

:set stab=4

जो चलने के बराबर होगा:

:set tabstop=4 softtabstop=4 shiftwidth=4 

क्या कोई सुझाव दे सकता है कि यह कैसे किया जा सकता है?


अपडेट करें

बहुत अधिक php , hobbs और kaiser.se से अब तक उत्तरों के लिए धन्यवाद । व्यक्तिगत रूप से प्रत्येक का उत्तर देने के बजाय, मैं यहां प्रश्न को अपडेट कर रहा हूं।

सॉफ्टटैबटॉप को एक्सपेंडेबट के साथ बंद कर दिया गया

मैंने ऊपर कहा कि विस्ताराटैब स्विच ऑफ के साथ, टैब कुंजी सम्मिलित करता है जो कि मिलान करने वाले टैब + स्पेस वर्णों की सबसे छोटी संभव संख्या सम्मिलित करता है softtabstop। मैं उसके साथ खड़ा हूं, लेकिन मुझे लगता है कि मुझे समझाने की जरूरत है कि मेरा क्या मतलब था। मैं कुछ उदाहरणों के माध्यम से ऐसा करने का प्रयास करूंगा। साथ पालन करने के लिए, चलाएं :set listताकि आप टैब वर्ण देख सकें।

tabstop=4 softtabstop=2 shiftwidth=4 noexpandtab

सम्मिलित मोड में, टैब कुंजी आवेषण 2 स्थान वर्णों को दबाता है। टैब कुंजी को दूसरी बार दबाएं, और दो और अंतरिक्ष वर्ण (कुल 4 अंतरिक्ष वर्णों के लिए) डालने के बजाय यह पिछले 2 स्थानों को एक एकल टैब वर्ण के साथ बदल देता है। टैबस्टॉप 4 पर सेट है, इसलिए एक एकल टैब वर्ण में 4 रिक्त स्थान के समान चौड़ाई है।

tabstop=4 softtabstop=6 shiftwidth=4 noexpandtab

सम्मिलित मोड में, टैब कुंजी आवेषण 1 टैब वर्ण और 2 रिक्त स्थान दबाते हैं। टैब वर्ण की चौड़ाई 4 है, इसलिए कुल चौड़ाई 6 है, और इसे 3 वर्णों का उपयोग करके प्राप्त किया गया है। टैब कुंजी को दूसरी बार दबाने पर दो टैब वर्ण सम्मिलित होते हैं, और उन दो रिक्त स्थान को हटा देता है जिन्हें पहले डाला गया था। कुल चौड़ाई 12 है, और इसे 3 वर्णों का उपयोग करके प्राप्त किया जाता है।

इन दोनों उदाहरणों में, Vim सॉफ्टटैबस्टॉप से ​​मेल खाने वाले टैब + स्पेस वर्णों की न्यूनतम संभव संख्या सम्मिलित करता है।

अगर मैं एक्सपेंडेबट स्विच ऑफ के साथ काम कर रहा हूं, तो मैं खुद को अतिरिक्त दानेदार नियंत्रण की इच्छा नहीं देख सकता हूं जो सॉफ्टटॉपस्टॉप को टैबस्टॉप से ​​अलग मूल्य पर सेट करके प्राप्त किया जा सकता है। यह अभी भी मेरे लिए सेट करने में सक्षम होने के लिए tabstop, softtabstopऔर shiftwidthएक ही कमांड के साथ समान मूल्य के लिए उपयोगी होगा ।

क्या एक्सपैंडटैब सॉफ्टटैबटॉप को बेमानी बनाता है?

tabstop=4 softtabstop=0 shiftwidth=4 expandtab

सम्मिलित मोड में, टैब कुंजी आवेषण 4 स्थानों को दबाता है। डिलीट की को दबाने से सिंगल स्पेस डिलीट हो जाता है - इसलिए अगर गलती से टैब की चाबी मार दी तो आपको 4 बार बैकस्पेस देना होगा।

tabstop=4 softtabstop=4 shiftwidth=4 expandtab

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

अगर मैं expandtabस्विच ऑन के साथ काम कर रहा हूं, तो मैं टैब कुंजी आवेषण के रूप में व्हाट्सएप की समान मात्रा को हटाने के लिए डिलीट कुंजी पसंद करूंगा। तो इस मामले में भी, मुझे लगता है कि यह एक ही मूल्य को निर्दिष्ट करने में सक्षम होना उपयोगी होगा tabstop, softtabstopऔर shiftwidthसाथ ही साथ।

एक शॉर्टकट अभी भी उपयोगी होगा

यह बहुत अच्छा है कि विम इतना लचीलापन प्रदान करता है, लेकिन मैं खुद को इसकी आवश्यकता नहीं देख सकता। मैं बस एक टैब की चौड़ाई का चयन करने में सक्षम होना चाहता हूं, और चाहे वह 'हार्ड' टैब (टैब कैरेक्टर का उपयोग कर) हो या 'सॉफ्ट' टैब (स्पेस से बना) हो। हार्ड और सॉफ्ट टैब्स के बीच टॉगल करना काफी आसान है ( :set expandtab!), लेकिन मेरी इच्छा है कि टैब की चौड़ाई सेट करने के लिए यह अधिक सीधा था, बिना 3 अलग-अलग मापदंडों के साथ फील करना।

तो कुछ के लिए मेरा प्रस्तावित सुझाव :set stab=4अभी भी मुझे अच्छा लगता है।


ऐसा प्रतीत होता है जैसे आपके यहां दो अलग-अलग प्रश्न हैं, शायद आपको अपने प्रश्न को दो में विभाजित करना चाहिए।
ग्रेग हेविगेल

आप सही हे! मैंने दूसरे प्रश्न को स्वयं के विषय में स्थानांतरित कर दिया है।
नेलस्ट्रॉम

1
यह एक सवाल के बजाय एक RFE की तरह लगता है। जैसे, आपको शायद VIM समुदाय का प्रस्ताव देना चाहिए: vim.org/community.php - या बस एक पैच लिखना चाहिए। इसके अलावा, वीआईएम में एक व्यापक मैक्रो सुविधा है जो आपको नए संचालन को परिभाषित करने की अनुमति देती है, इसलिए यह बहुत संभावना है कि आप बस एक मैक्रो बना सकते हैं जो आपको चाहिए।
kdgregory

@nelstrom आपके प्रश्न के संबंध में is there a practical case where you wouldn't want shiftwidth == tabstop && tabstop == softtabstop?, विम का अपना स्रोत कोड उपयोग करता है set shiftwidth=4 tabstop=8 noexpandtab। हाँ, एक आम तौर पर चाहता है shiftwidth == softtabstop, लेकिन यह है कि क्या मूल्य से स्वतंत्र tabstopहै।
जामसेन

जवाबों:


56

stabविम में एक विकल्प बनाना स्वयं आसान नहीं होगा, लेकिन मैंने इस कमांड / फ़ंक्शन को व्हिप किया है जिसे आप अपने .vimrc(या एक प्लगइन फ़ाइल में ड्रॉप कर सकते हैं यदि आप सुपर-व्यवस्थित हैं)। उपयोग करें :Stabऔर आपको एक इंडेंट स्तर के लिए संकेत दिया जाएगा और उपयोग करना है या नहींexpandtab । यदि आप इसे एक नया इंडेंट स्तर दिए बिना दर्ज करते हैं, तो यह वर्तमान सेटिंग्स को प्रिंट करेगा।

"यह सब अपने .vimrc या एक प्लगइन फाइल में रखें
आदेश! -नरग्स = * स्टैब कॉल स्टैब ()
समारोह! वार ()
  आइए l: tabstop = 1 * इनपुट ('सेट अपवर्जन =')

  अगर l: tabstop> 0
    "क्या हम एक्सपैंटाब भी चाहते हैं?
    चलो l: का विस्तार करें = पुष्टि करें ('विस्तार करें सेट?', "और हां \ n और नहीं \ n और रद्द करें")
    अगर एल: एक्सपर्टटैब == 3
      “गर्भपात?
      वापसी
    अगर अंत

    let & l: sts = l: tabstop
    let & l: ts = l: tabstop
    let & l: sw = l: tabstop

    अगर एल: एक्सपर्टटैब == 1
      सेटलोक विस्तारक
    अन्य
      सेट्लोकल नोक्सीपांडटैब
    अगर अंत
  अगर अंत

  "चयनित विकल्प दिखाएं
  प्रयत्न
    इचोहल मोडमस्ग
    एकॉन 'सेट टैबस्टॉप ='
    echohl प्रश्न
    echon & l: ts
    इचोहल मोडमस्ग
    इकोन 'शिफ्ट ='
    echohl प्रश्न
    इकोन एंड एल: स्व
    इचोहल मोडमस्ग
    इकोन 'sts ='
    echohl प्रश्न
    echon & l: sts। ''। (और एल: एट! '': 'नहीं')
    इचोहल मोडमस्ग
    एकॉन 'एक्सपेंडेब'
  आखिरकार
    ईकोहल कोई नहीं
  endtry
endfunction

3
स्क्रिप्ट के लिए धन्यवाद! यह मेरे द्वारा पूछे जाने से अधिक है - मुझे लगता है कि मैं विस्तारक को इसके बाहर रखना पसंद करूंगा - लेकिन मैं इसे आसानी से अपनी पसंद के अनुसार अनुकूलित कर सकता हूं। आपने मुझे विम्सस्क्रिप्ट में एक छोटा क्रैश कोर्स प्रदान किया है, इसलिए मैं बहुत आभारी हूं। 100 अंक का इनाम आपका है!
नेलस्ट्रॉम

9

विमस्क्रिप्ट लिखने पर यह मेरा पहला प्रयास है, लेकिन यहाँ जाता है:

function! Stab(value)
    let &shiftwidth  = a:value
    let &softtabstop = a:value
    let &tabstop     = a:value
endfunc

अगर मैं इसे अपनी .vimrc फ़ाइल में रखता हूं, तो मैं इसे चलाकर कॉल कर सकता हूं :call Stab(X), जहां एक्स वांछित टैब चौड़ाई है। यह अभी के लिए एक पर्याप्त समाधान है, लेकिन अगर कोई मुझे कॉल करने के लिए आसान बनाने के तरीके का सुझाव दे सकता है तो मैं आभारी रहूंगा।

मैंने एक फ़ंक्शन भी बनाया है जो वर्तमान सेटिंग्स को जल्दी से सारांशित करता है, जिसे मैंने ctrl-Tab में मैप किया है:

nmap <C-Tab> :call TabParams()<CR>
function! TabParams()
    echo "tabstop:     ".&tabstop
    echo "shiftwidth:  ".&shiftwidth
    echo "softtabstop: ".&softtabstop
endfunc

खैर, मैंने इस जवाब के लिए एक 100 अंक का इनाम रखा, और अब मैंने इसे आधा हल कर लिया है। यकीन नहीं होता कि मैं अपना जवाब खुद स्वीकार कर सकता हूं ...


+1 हाँ, लेकिन अगर यह वही है जो आप वास्तव में चाहते हैं, यह अभी भी एक ठीक जवाब है।
डेविपैरिलो

2
आप शायद स्थानीय संस्करणों को सेट करने के लिए let & l: shiftwidth आदि का उपयोग करना चाहते हैं।
SystemParadox

7

आप संपादन मोड में भी उपयोग कर सकते हैं Ctrl-Tमांगपत्र के लिए और Ctrl-Ddeindent करने से सेट के रूप में अगले स्तर तक खरोज shiftwidth, की परवाह किए बिना tabstop, softtabstopया expandtabसेटिंग्स। विम स्वचालित रूप से सही कॉलम में लाने के लिए रिक्त स्थान या टैब जोड़ / हटा देगा।

यदि आप इन आदेशों का उपयोग इंडेंटेशन को नियंत्रित करने के लिए करते हैं Tab/ Backspaceतो आपको इन सभी टैब सेटिंग्स को एक साथ फिट करने के बारे में चिंता करने की आवश्यकता नहीं है और हमेशा सही इंडेंटेशन स्तर तक पहुंचें।


3

यदि expandtabसेट किया जाता है (जैसा कि बहुत अधिक php बताते हैं), softtabstopनिरर्थक हो जाता है। एकमात्र कारण जिसे आप shiftwidthअलग-अलग तरीके से निर्धारित कर सकते हैं tabstopवह एक अजीब आदत को पूरा करने के लिए होगा; उदाहरण के लिए, आप चार-स्थान इंडेंट का उपयोग करते हैं लेकिन आप tabआठ स्थान सम्मिलित करना पसंद करते हैं ।

अगर expandtabकोई परेशान है तो चीजें फ़िज़ूल हो जाती हैं। यदि आप चाहते हैं कि आपका कोड समान catऔर गैर-विम संपादकों के साथ समान दिखे जैसा कि यह विम में है, तो tabstopहमेशा 8 पर सेट होना चाहिए; इस मामले में आप सेट softtabstopऔर shiftwidthदोनों अपने पसंदीदा इंडेंट स्तर पर होगा। यदि आप इसके बजाय पसंद करते हैं कि फ़ाइल में प्रत्येक "भौतिक टैब" एक इंडेंट स्तर का प्रतिनिधित्व करता है, तो आप सेट tabstopऔर shiftwidthअपने पसंदीदा इंडेंट स्तर softtabstopपर जाएंगे और शून्य पर छोड़ देंगे (इसे बराबर सेट करना बराबर tabstopहै सिवाय इसके कि यदि आप tabstopइसे बदलते हैं तो यह सिंक से बाहर हो जाएगा, जबकि शून्य का अर्थ है "कृपया इसे अनदेखा करें")।


3
मुझे लगता है कि यह गलत है क्योंकि केवल softtabstopसही मूल्य के सेट के साथ , बैकस्पेस एक स्थानिक इंडेंट को हटा देगा जैसे कि यह एक टैब था। जो कि उपयोग के लिए जरूरी है।
u0b34a0f6ae

2

बारे में आपकी समझ softtabstopऔर expandtabगलत है - तो stabविकल्प आपको सुझाव है कि बहुत उपयोगी नहीं होगा।

expandtabतब होता है जब आप हर चीज के लिए टैब के बजाय रिक्त स्थान का उपयोग करना चाहते हैं । यदि आप सेट करते हैं expandtab, तो विम softtabstopविकल्प और उपयोग को अनदेखा करता है tabstopऔर shiftwidthयह पता लगाने के लिए कि कितने स्थान सम्मिलित करने हैं।

softtabstopकेवल तब के लिए होता है जब आप टैब और रिक्त स्थान के मिश्रण का उपयोग करना चाहते हैं , जिससे आपको ठीक नियंत्रण (2 या 4 रिक्त स्थान) के साथ इंडेंट करने की अनुमति मिलती है, जबकि टैब मूल्य को उच्च मूल्य (आमतौर पर 8) पर रखते हुए ताकि पाठ अन्य अनुप्रयोगों में दिखाई दे । सेटिंग softtabstop=tabstopकुछ भी पूरा नहीं करती है क्योंकि विम हमेशा इंडेंटिंग के लिए टैब का उपयोग करेगा।

अपडेट: जैसा कि kaizer.se ने इंगित किया है, यदि आप उपयोग कर रहे हैं expandtab, तो आपको अभी भी सेट करने की आवश्यकता है softtabstopयदि आप चाहते हैं कि विम कई स्थानों को बैकस्पेस दें, क्योंकि वे एक टैब हैं।


जब आप सही होते हैं tabstopऔर सेट softtabstopहोने पर बहुत अधिक परिवर्तनशील हो जाते हैं extpandtab, तो मुझे लगता है कि आप प्राथमिकता पर गलत हैं। बस इसे आज़माएं: ts=8 sts=4 etटैब सेट करें और दबाएं; कर्सर पांच कॉलम में होगा, और चार स्थान डाले जाएंगे, जैसे कि आपने सेट किया था ts=4 sts=0 et
हॉब्स

5
मुझे लगता है कि यह गलत है क्योंकि केवल softtabstopसही मूल्य के सेट के साथ , बैकस्पेस एक स्थानिक इंडेंट को हटा देगा जैसे कि यह एक टैब था। जो कि उपयोग के लिए जरूरी है।
u0b34a0f6ae

2

क्या आप अपनी सफेद स्थान सेटिंग्स को इतनी बार बदल रहे हैं कि आपको वास्तव में इसे प्रबंधित करने के लिए एक फ़ंक्शन की आवश्यकता है? यदि आप टैबस्टॉप के साथ बहुत गड़बड़ कर रहे हैं और एक्सपेंडेब सेट भी कर रहे हैं, तो संभवतः आप समय के साथ एक गड़बड़ होने जा रहे हैं क्योंकि आप विभिन्न मानों के साथ फाइल बदलते हैं stab। आज मैं उपयोग करता हूं :call stab (4), कल यह है :call stab (2)और पिछले सप्ताह यह था :call stab (8)। अगर आप इसे लिखते हैं तो भी लगता है, आप जल्द ही इसका इस्तेमाल बंद कर देंगे।

यदि आप हमेशा एक ही मूल्य को छुरा घोंपने की योजना बनाते हैं, तो केवल अपनी वैश्विक सेटिंग्स को संपादित क्यों नहीं करें? विम में:

:e $MYVIMRC

और निम्नलिखित जोड़ें:

set tabstop=4
set shiftwidth=4  "tabs are 4 spaces wide (default = 8)
set expandtab     "Convert tabs to spaces

इस तरह मेरा .vimrc सेटअप है।


1

एक उपयोगी विकल्प है softtabstop=-1जो इसे के मूल्य पर सेट करेगा shiftwidth
आप shiftwidth0 पर भी सेट कर सकते हैं , जिस स्थिति में tabstopमूल्य का उपयोग किया जाएगा।

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