रिक्त स्थान के साथ टैब कैसे बदलें?


85

क्या पाठ संरेखण को बनाए रखते हुए टैब को रिक्त स्थान में परिवर्तित करना संभव है?

जब कोई प्रमुख पात्र नहीं होते हैं तो केवल उपयोगी तरीके से प्रतिस्थापित किया जाता है।


यदि आपने vim-faq स्थापित किया है , तो आप वहां ऑफ़लाइन उत्तर प्राप्त कर सकते हैं: :h vim-faqऔर खोज करें /tab characters। टैग को याद रखना कठिन है :h faq-14.16
होट्सचेक

जवाबों:


98

आप :retabकमांड का उपयोग कर सकते हैं । से :help :retab

<Tab>दिए गए नए टैबस्टॉप मान का उपयोग करके व्हाइट-स्पेस के नए तारों के साथ व्हाइट-स्पेस के सभी दृश्यों को बदलें । यदि आप एक नया टैबस्टॉप आकार निर्दिष्ट नहीं करते हैं या यह शून्य है, तो विम वर्तमान मूल्य का उपयोग करता है 'tabstop'। [...] 'expandtab'पर, Vim ने सभी टैब को रिक्त स्थान की उचित संख्या के साथ बदल दिया।

ध्यान दें कि कमांड एक सीमा को स्वीकार करता है, इसलिए आप एक दृश्य चयन कर सकते हैं और फिर केवल :retabचयनित लाइनें।


ठंडा! तेजी से और सरल काम करता है!
डेनिसकोलोडिन

2
एक उदाहरण प्रदान करने के बारे में कैसे?
पेट्र

23

:retabजैसा कि कहा गया है, आप उपयोग कर सकते हैं , हालांकि, यह सभी टैब को रिक्त स्थान में बदल देगा , केवल लाइन की शुरुआत में टैब

तो यह (जहां एक टैब वर्ण है):

if :; do
⇥echo "⇥hello"
end

बदल जाता है (जहां एक अंतरिक्ष चरित्र है):

if :; do
␣␣echo "␣␣hello"
end

यह कुछ परिदृश्यों में अनपेक्षित दुष्परिणाम पैदा कर सकता है, और जब टैब में स्थान बदलते हैं तो यह और भी अधिक होता है!

इसलिए, मैंने लाइन के शुरू में केवल टैब / स्पेस बदलने के लिए एक छोटा सा फंक्शन लिखा :

" :retab changes *everything*, not just start of lines
fun! Retab(expandtab)
    let l:spaces = repeat(' ', &tabstop)

    " Replace tabs with spaces
    if a:expandtab
        silent! execute '%substitute#^\%(' . l:spaces . '\)\+#\=repeat("\t", len(submatch(0)) / &tabstop)#e'
    " Replace spaces with tabs
    else
        silent! execute '%substitute#^\%(\t\)\+#\=repeat("' . l:spaces . '", len(submatch(0)))#e'
    endif
endfun

इस संस्करण के साथ, आपको expandtabफ़ंक्शन कॉल में मैन्युअल रूप से निर्दिष्ट करना होगा (यानी :call Retab(1), स्थान को टैब बदलने के लिए), लेकिन आप इसे वर्तमान मूल्य &expandtab(जैसा कि यह पहले से ही करता है &tabstop) को पसंद करने के लिए संशोधित कर सकते हैं :retab। (मैं इसे मैन्युअल रूप से निर्दिष्ट करना पसंद करता हूं)।


6
SO पर एक उत्तर भी है जो केवल लाइन के प्रारंभ में रीटैबिंग को कवर करता है। यह उस स्पष्टीकरण की स्पष्टता के कारण लिंक करने योग्य है।
जलानब

क्या कोई समझा सकता है कि अक्षर aका if a:expandtabमतलब क्या है?
जॉन सीजे

इसके अलावा, ऐसा लगता है कि स्थिति उलट है (एक मजाक: डी?)। यदि आपके पास set expandtabअपने .vimrc में है और फिर autocmd BufWritePre * :call Retab(&expandtab)- रिक्त स्थान के बजाय इंडेंटेशन को टैब में बदल दिया जाएगा।
जॉन सीजे

11

Vim !retabकमांड देता है जो दिए गए <Tab>नए टैबस्टॉप (जैसे :set tabstop=2) मूल्य का उपयोग करके सफेद-स्थान के नए तारों के साथ सभी अनुक्रमों को बदल देगा , लेकिन स्ट्रिंग के अंदर सभी टैब संशोधित किए जा सकते हैं (जैसे C प्रोग्राम में, आपको इससे \tबचने के लिए उपयोग करना चाहिए )!

इसलिए वैकल्पिक रूप से आप निम्न कमांड का उपयोग करके सभी टैब को रिक्त स्थान में बदल सकते हैं:

:%s/\t/  /g

या @ शहबाज द्वारा सुझाए गए अनुसार :

:%s/^\t\+/ g

तो केवल इंडेंटेशन में उपयोग किए जाने वाले टैब परिवर्तित किए जाते हैं।

स्पष्टीकरण:

  • %संपूर्ण बफ़र / फ़ाइल ( :help :%) का प्रतिनिधित्व करता है
  • sस्थानापन्न के लिए खड़ा है ( :help sub-replace-special)
  • \t, या ^Iटैब के लिए खड़ा है
  • - जितने स्पेस चाहिए उतने टैब के लिए इस्तेमाल करें
  • g - वैश्विक के लिए खड़ा है, और यह एक ही पंक्ति में टैब की कई घटनाओं को बदल देगा

फिर संपूर्ण फ़ाइल के इंडेंटेशन को ठीक करने के लिए, आप कोशिश कर सकते हैं gg=G:। जांच करें: अधिक विवरण के लिए बुरी तरह से इंडेंट किए गए कोड को फिर से इंडेंट करना

टैब के बजाय डिफ़ॉल्ट रूप से रिक्त स्थान का उपयोग करने के लिए, आपको अपनी .vimrcफ़ाइल में निम्नलिखित सेटिंग्स जोड़ने की आवश्यकता है :

set tabstop=2     " (ts) width (in spaces) that a <tab> is displayed as
set expandtab     " (et) expand tabs to spaces (use :retab to redo entire file)
set shiftwidth=2  " (sw) width (in spaces) used in each step of autoindent (aswell as << and >>)

वैकल्पिक समाधान का उपयोग करना है tidy


सम्बंधित:


1
मैं कम से कम ऐसा करूंगा %s/^\t\+/ gकि केवल इंडेंटेशन में उपयोग किए जाने वाले टैब ही रूपांतरित हों। इसके अलावा, gg=Gअजगर जैसी भाषाओं के साथ विनाशकारी हो सकता है।
शहबाज़

3

प्रयोग करके देखें:

expand -t 4 input_filename output_filename

expandटैब को रिक्त स्थान में परिवर्तित करने के लिए एक कमांड-लाइन टूल है, जिसे आप शेल से या उसके साथ चला सकते हैं :!expand

यह POSIX में है इसलिए यह अधिकांश प्रणालियों पर उपलब्ध होना चाहिए। unexpandउल्टा करेंगे, वैसे।


2
क्या है expand?
मूरू

विस्तार एक इनबिल्ट टर्मिनल कमांड है जो टैब कैरेक्टर को स्पेस में कॉपी करता है। कृपया निम्नलिखित लिंक में एक विस्तृत शिलालेख खोजें। computerhope.com/unix/uexpand.htm
अंकित शाह

2
यदि ये बाहरी आदेश हैं, तो आपको इसका उल्लेख करना चाहिए।
मुरु

आगे विवरण जोड़ा गया। कृपया समीक्षा करें
अंकित शाह

5
तुम भी सिर्फ :%!expand -t 4विम के अंदर कर सकता है । बेहतर अभी तक, आप वर्तमान बदलाव चौड़ाई विकल्प का उपयोग भी कर सकते हैं: :exe '%!expand -t ' . &shiftwidth
एवरग्रीनट्री

1

पूर्णता के लिए, =इंडेंटेशन को ठीक करने के लिए भी इस्तेमाल किया जा सकता है, आपके द्वारा निर्दिष्ट करने के बाद कि टैब को रिक्त स्थान से बदल दिया जाता है। सामान्य मोड में, आप टाइप करके ऐसा कर सकते हैं :set expandtab। फिर =दो तरीकों से इस्तेमाल किया जा सकता है:

  • दृश्य मोड में, एक =चयनित कोड ब्लॉक के इंडेंटेशन को ठीक करेगा।
  • सामान्य मोड में, gg=Gपूरी फ़ाइल को ठीक करेगा, जहाँ ggकर्सर को फ़ाइल की शुरुआत में ले जाता =है , फिर लागू किया जाता है, और Gकर्सर को फ़ाइल के अंत में ले जाता है।

संदर्भ: लिंक


यह मानता है कि वर्तमान इंडेंटेशन को सही तरीके से पुन: स्थापित किया जा सकता है (मामला नहीं हो सकता है) - भी असंरचित फ़ाइलों के लिए, या थोड़ा अलग इंडेंटेशन नियमों के साथ एक अलग संपादक में लिखा कोड।
ideasman42

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