2011-06-21 5 views
8

यह प्रश्न लगभग this question के समान है, सिवाय इसके कि मुझे चार की बजाय तीन रिक्त स्थान (कंपनी कोडिंग दिशानिर्देश) पर जाना है और स्वीकृत समाधान केवल मिलान पैटर्न को दोगुना कर देगा। यहां मेरा पहला प्रयास था:2 स्पेस इंडेंटेशन से 3 तक जाने के लिए स्रोत फ़ाइल को दोबारा कैसे सुधारें?

:%s/^\(\s\s\)\+/\1 /gc 

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

मैं भी पहले और उसके बाद अगले छोटे मांगपत्र सबसे बड़ा इंडेंट की जगह मैन्युअल रूप से प्रतिस्थापन कर रही करने की कोशिश की जब तक मैं यह सब परिवर्तित हो गया है, लेकिन इस रिक्त स्थान का ट्रैक रखने के मुश्किल था:

:%s/^    \(\S\)/      \1/gc 

मैं भेज सकता है यह पर्ल के माध्यम से ऐसा लगता है जैसे पर्ल के पास Extended Patterns के साथ ऐसा करने की क्षमता हो सकती है। लेकिन मैं इसे पर्ल के अपने संस्करण के साथ काम नहीं कर सका। यहाँ एक के गिनती करने की कोशिश कर के साथ मेरा प्रयास था:

:%!perl -pe 'm<(?{ $cnt = 0 })(a(?{ local $cnt = $cnt + 1; }))*aaaa(?{ $res = $cnt })>x; print $res' 

मेरे अंतिम उपाय रूपांतरण करने के लिए एक पर्ल स्क्रिप्ट लिखने के लिए किया जाएगा, लेकिन मैं विम में एक अधिक सामान्य समाधान के लिए उम्मीद कर रही थी ताकि मैं करने के लिए विचार का पुन: उपयोग कर सकता है भविष्य में अन्य मुद्दों को हल करें।

+0

यह संभव है;) – Amadan

+0

धन्यवाद अमादन, सही उत्तर के रूप में चिह्नित किया गया। मुझे आश्चर्य है कि कोई मुझे दिखा सकता है कि अगर समाधान पर्ल रेगेक्स के माध्यम से भेजा गया तो समाधान क्या दिख सकता है, क्योंकि मुझे स्क्रिप्ट में ऐसा करने की आवश्यकता हो सकती है? – stephenmm

+0

संबंधित: [बुरी इंडेंट कोड को फिर से इंडेंट करना] (http://vi.stackexchange.com/q/236/467) विम एसई – kenorb

उत्तर

7

इसे आपके लिए क्या करें?

:set sw=3<CR> 
gg=G 

पहले आदेश shiftwidth विकल्प है, जो आप कितना द्वारा इंडेंट सेट। दूसरी पंक्ति कहती है: फ़ाइल के शीर्ष तक फ़ाइल (gg), और रीइंडेंट (=) के शीर्ष पर जाएं (G)।

बेशक, यह आपके द्वारा उपयोग की जाने वाली भाषा के लिए एक अच्छा फॉर्मेटर रखने पर निर्भर करता है। यदि नहीं तो कुछ गड़बड़ हो सकता है।

Regexp रास्ता ... सुरक्षित हैं, लेकिन कम समझ में आता है:

:%s#^\(\s\s\)\+#\=repeat(' ',strlen(submatch(0))*3/2)#g 

दो अंक (। मैं कुछ प्रयोग करना पड़ा):

  • प्रतिस्थापन \= से प्रारंभ होता है , यह एक अभिव्यक्ति के रूप में मूल्यांकन किया जाता है।
  • आप / के बजाय कई चीजों का उपयोग कर सकते हैं, इसलिए / विभाजन के लिए उपलब्ध है।
+0

पर शिफ्टविड्थ सामान वास्तव में मेरी फाइल को खराब कर देता है लेकिन रेगेक्स पूरी तरह से काम करता है! धन्यवाद! मैंने '\ =' के बारे में और जानने के लिए विम सहायता की कोशिश की लेकिन मुझे यकीन नहीं है कि मदद में क्या देखना है। क्या आप मुझे दस्तावेज में इंगित कर सकते हैं जो इसके बारे में बात करता है? – stephenmm

+2

': मदद उप-प्रतिस्थापन-अभिव्यक्ति ' – phant0m

+0

एक' retab' कमांड है। – ZyX

1

पर्ल संस्करण आपके लिए ...

कमांड लाइन से (यथा-स्थान संपादन, कोई वैकल्पिक) से पूछा:

bash$ perl -pi -e 's{^((?: )+)}{" " x (length($1)/2)}e' YOUR_FILE 

(यथा-स्थान, मूल अप करने के लिए "का समर्थन किया आपकी फाइल।बक दो अंतरिक्ष "समूह"):

bash$ perl -pi.bak -e 's{^((?: )+)}{" " x (length($1)/2)}e' YOUR_FILE 

vim से YOUR_FILE संपादित करते समय

:%!perl -pe 's{^((?: )+)}{" " x (length($1)/2)}e' 

regex पंक्ति के आरंभ, जिसके बाद (के कब्जा कर लिया सेट) एक या अधिक मेल खाता है "। प्रतिस्थापन पैटर्न एक पर्ल अभिव्यक्ति है (इसलिए 'ई' संशोधक) जो "दो स्थान" समूहों की संख्या को गिना जाता है जो कब्जे में थे और उसी "तीन स्थान" समूहों की एक स्ट्रिंग बनाता है। यदि कोई "अतिरिक्त" स्थान था मूल में मौजूद यह प्रतिस्थापन के बाद संरक्षित है। इसलिए यदि आपके पास पहले तीन स्थान थे, तो आपके पास चार के बाद, पांच से पहले सात में बदल जाएगा, आदि

+0

ग्रेट सामान, धन्यवाद ब्रायन! – stephenmm

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