2012-07-22 10 views
5

कई लोग टैब के बजाय रिक्त स्थान का उपयोग करते हैं। मैं दोनों का उपयोग करता हूं। पहले गैर-व्हाइटस्पेस चरित्र से रेखा और रिक्त स्थान की शुरुआत में टैब। नए दस्तावेज़ को शुरू करने के लिए कोई समस्या नहीं है और यदि मुझे प्रारूप का उपयोग करने के लिए एक बेहतर अनुकूलन को संशोधित करना है। फिर भी कभी-कभी मुझे रिक्त स्थान को ठीक करने की आवश्यकता होती है।प्रमुख रिक्त स्थान को टैब में कैसे परिवर्तित करें?

Search and replace के अनुसार मैं केवल :%s/spaces_for_tab/tab/g कर सकता हूं। यह आसान है और यह कई मामलों के लिए काम करेगा। वैसे भी मैं लाइन की शुरुआत में केवल रिक्त स्थान रेफैक्टर करना चाहता हूं।

+2

': सेट नोएट ', कन्वर्ट करने के लिए ब्लॉक का चयन करें,': retab! ' – ninjalj

+0

@ निंजलज हां यह काम करता है, लेकिन कनवर्ट करने के लिए ब्लॉक का चयन कभी-कभी कठिन हो सकता है। –

+0

संभावित डुप्लिकेट [मैं विम या लिनक्स में रिक्त स्थान को टैब में कैसे परिवर्तित कर सकता हूं?] (Http://stackoverflow.com/questions/9104706/how-can-i-convert-spaces-to-tabs-in-vim-or -linux) –

उत्तर

2

मैंने इसके लिए एक साधारण func लिखा है। वैसे भी यह केवल 4-स्पेस टैब के लिए काम करेगा।

fu! Fixspaces() 
     while search('^\t* \{4}') != 0 
       execute ':%s/^\t*\zs \{4}/\t/g' 
     endwhile 
endfu 

यदि आप मौजूद हैं, तो बेहतर समाधान का सुझाव दे सकते हैं, और मैं इसे खुशी से उपयोग करूंगा। मुद्दा यह है कि यह func तारों में रिक्त स्थान को भी बदल देता है।

function Fixspaces() 
    let ts = &tabstop 
    let pos = getpos('.') 

    if &expandtab 
    while search('^ *\t') != 0 
     silent execute ':%s/^ *\zs\t/'.repeat(' ', ts).'/g' 
    endwhile 

    echo 'Changed tabs to spaces' 
    else 
    while search('^\t* \{'.ts.'}') != 0 
     silent execute ':%s/^\t*\zs \{'.ts.'}/\t/g' 
    endwhile 

    echo 'Changed spaces to tabs' 
    endif 

    call setpos('.', pos) 
endfunction 

इस समारोह expandtab और tabstop सेटिंग्स के मूल्यों के आधार पर उचित बात करता है और यह भी याद है, जहां कर्सर है:

+0

यह पहली बार है जब मैं अपना जवाब चिह्नित करता हूं। वैसे भी यह एक बड़ा काम है (मल्टीलाइन स्ट्रिंग्स, एचटीएमएल प्री टैग्स में बदलाव की जगहों को रोकें, और इसी तरह) मेरा कार्यान्वयन थोड़ा सा बेवकूफ है। –

+0

यह एक अच्छा समाधान नहीं है, 'नोएक्सपैंडटैब' –

+0

@sg के साथ संयोजन में 'रीटैब' जैसे वीम के बिल्टिन कमांड का उपयोग करें यदि मैं सही ढंग से समझता हूं, तो मार्टिन की शिकायत यह है कि अकेले 'रीटब' अपेक्षा के अनुसार काम नहीं करता है और 'रीटैब! 'लाइन पर रिक्त स्थान टैब * कहीं भी * (स्ट्रिंग अक्षर के अंदर भी) परिवर्तित करता है। यह वास्तव में अधिक उचित है कि केवल अग्रणी व्हाइटस्पेस टैब में परिवर्तित हो जाएगा। –

5

यह regex समस्या से अधिक है। लाइन की शुरुआत में एंकर करने के लिए, कैरेट का उपयोग करें, उदा।

s/^  /\t/ 

या यह vim के अंतर्निहित कार्यक्षमता का उपयोग करें:

:set tabstop=4 "four spaces will make up for one tab 
:set noexpandtab "tell vim to keep tabs instead of inserting spaces 
:retab   "let vim handle your case 

वैसे, मैं भी संरेखण के लिए खरोज के लिए टैब और रिक्त स्थान पसंद करते हैं। दुर्भाग्य से, vim doesn't handle this well (और मैं क्या अन्य संपादकों करना पता नहीं), इसलिए मैं ज्यादातर :set expandtab का उपयोग (शायद :set softtabstop देखें)।

+0

आप आमतौर पर 'retab' के बजाय 'retab!' चाहते हैं। –

+1

समस्या यह है कि, जैसा कि आपने लिखा है, वीआईएम इस अच्छी तरह से संभाल नहीं लेता है (अधिक संभावना है कि मैं सिर्फ वीआईएम की कुछ विशेषता याद करता हूं, वीआईएम हमेशा मेरे लिए आश्चर्यजनक है) क्योंकि रीटैब सभी जगहों को न केवल प्रमुख लोगों को बदल देता है। –

-1

मैं अगर कोई रुचि है मार्टिन जवाब लिया और थोड़ा उस पर सुधार हुआ है।

संबंधित मुद्दे