बुरी तरह से इंडेंट किए गए कोड को फिर से इंडेंट करना


39

मुझे विम का स्मार्ट-इंडेंट फीचर पसंद है, यह मुझे अच्छी तरह से इंडेंट कोड ब्लॉक बनाने की अनुमति देता है।

मैं बफ़र्स में नियमित रूप से कॉपी / पेस्ट कोड करता हूं, लेकिन यह कोड अक्सर खराब स्वरूपित होता है।

आदर्श क्या होगा स्मार्ट-इंडेंट सिस्टम के माध्यम से कोड को "री-प्रोसेस" करना।

क्या ऐसा करना संभव है?

उदाहरण के लिए, आप निम्नलिखित कोड को कैसे 'ठीक' करेंगे (एक बड़े ब्लॉक से एक अर्क - मैं प्रत्येक पंक्ति को मैन्युअल रूप से ठीक नहीं करना चाहता ...):

    else 
                {
                        m[c] = 5;
                Finished = true;
std::cout<<"(ID,R,E)"<<"-->"<<"("<<g[c]<<","<<r[c]<<","<<E1 <<")"<< std::endl;
std::cout << "\n"<<"finish-->" << r[c] << "\t" <<"E1-->"<< E1 <<"\n" ;
                }
        }

1
क्या आप उस चिपकाने वाले कोड के बारे में बात कर रहे हैं जो मूल रूप से खराब इंडेंटेड या ठीक से इंडेंटेड कोड था जो आपके विम में पेस्ट करने पर बदल जाता है?
जामसेन

चिपकाया कोड शुरू करने के लिए खराब रूप से प्रेरित है। मुझे एक उदाहरण शामिल करें ....
रॉफेल

जवाबों:


48

मैं इसे दो तरीकों में से एक करता हूं।

इंडेंट समायोजित पेस्ट

सबसे पहले, यदि बफ़र में कोड को स्वरूपित किया गया है, लेकिन इंडेंटेशन के एक अलग स्तर पर, मैं ]pइसके बजाय का उपयोग करता हूं p, जो कि कोड को चिपकाता है, लेकिन इंडेंटेशन के साथ इस तरह शिफ्ट किया गया है कि पहली पंक्ति चिपकाई गई रेखा के समान गहराई है पर हूँ।

ईजी स्रोत को बफर में कॉपी किया गया

while (1) {
    dostuff();
}

इसके साथ चिपकाने का ईजी परिणाम ]p

int myfunc() {
    int i = 5; /* Cursor on this line before paste */
    while (1) {
        dostuff();
    }
 }

vim उसी इंडेंटेशन लेवल पर, जबकि डालता है int i। यह त्वरित है, लेकिन केवल तभी काम करता है जब कॉपी किए गए कोड को ठीक से अपने भीतर इंडेंट किया जाता है।

पेस्ट के बाद सुधार

=Vim reformats में ऑपरेटर कोड कॉन्फ़िगर किया गया स्वरूपण नियमों के आधार पर। चिपकाने के छोटे स्निपेट के लिए, मैं दृश्य मोड में जाऊंगा v, उन पंक्तियों का चयन करूंगा जिन्हें मैंने अभी चिपकाया था और फिर =उन्हें पुन: स्वरूपित करने के लिए दबाएं ।

बड़े चरागाहों के लिए, मैं इस तथ्य का लाभ उठाता हूं कि कर्सर पहले चिपकाई गई रेखा पर जाता है, और विम कुछ "84 और रेखाएं" जैसा कुछ कहता है। फिर मैं 84==उन 84 पंक्तियों को वापस करने के लिए प्रवेश कर सकता हूं (निश्चित रूप से, उन 84 पंक्तियों की संख्या, जिन्हें आप वास्तव में पेस्ट करते हैं)।

संदर्भ

:help ]p समायोजित इंडेंट पेस्ट के लिए

:help =कस्टम या बिलिन इंडेंट नियमों के माध्यम से कवर ={motion}, [count]==और {Visual}=छानने के लिए


6
आप अच्छी तरह से विज़ुअल मोड में पेस्ट किए गए कोड का चयन कर सकते हैं `[v`]
craigp

1
@ बेजर बस स्पष्ट करने के लिए, कि बैकटिक-ब्रैकेट-वी-बैकटिक-ब्रैकेट है?
फतस्कैट

1
हाँ .. textarea backticks के बारे में बाहर बेकार है, इसलिए मैं इसे एक कोड ब्लॉक में नहीं डाल सकता: P
लालची

यदि आप कर सकते हैं तो मैं = 100 को कॉन्फ़िगर किए गए स्वरूपण नियमों के आधार पर कोड को सुधारने के लिए = ऑपरेटर को सुधार देता हूं। मैं दिनों को बचा सकता था।
वॉसनाम

1
मैं पेस्ट करने के लिए <control + R> "का उपयोग करता हूं, ताकि मुझे इन्सर्ट मोड न छोड़ना पड़े।] p <कंट्रोल + के लिए बराबर है"?
A --- बी

15

=आदेश reindent के लिए इस्तेमाल किया जा सकता है।

अधिकांश सामान्य मोड कमांड की तरह इसे गति पर लागू किया जा सकता है, इसलिए आप इसके साथ बस पेस्ट किए गए कोड को फिर से डाल सकते हैं =']। यह वर्तमान कर्सर स्थिति से ']चिह्न तक पहुंचता है , जो पेस्ट की अंतिम पंक्ति है।

= विजुअल मोड से भी इस्तेमाल किया जा सकता है।

एक अन्य उपयोगी कमांड है ]p, जो वर्तमान लाइन के समान इंडेंट स्तर पर चिपकाता है। यह आसपास के पाठ के अनुसार, एक अलग इंडेंट गहराई पर, ठीक से इंडेंट किए गए टेक्स्ट को पेस्ट करने में मदद कर सकता है।


7

का उपयोग करते हुए =ap (स्मरक है 'प्रारूप एक पैरा') वर्तमान पैरा स्वत: स्वरूप को vim प्रयास करना होगा।

यदि आप संभावित सुधार पर ध्यान देना चाहते हैं, तो आप इसे vapवर्तमान पैराग्राफ का चयन करने के लिए उपयोग करने के लिए जल्दी और जल्दी पा सकते हैं =। मुझे यह उन फाइलों में उपयोगी लगता है जहां मुझे पता है कि विम गलत तरीके से सुधार करेगा, और मैं गलत तरीके से अन्य लाइनों को गलत तरीके से प्रारूपित नहीं करना चाहता।


4

पहले से ही बफ़र में किसी फ़ाइल को फिर से देखने के लिए, उपयोग करें gg=G: फिक्स इंडेंटेशन देखें

किसी फ़ाइल के एक भाग को रीइंडेंट करने के लिए, विभिन्न सीमाएं =फ़िल्टर पर लागू की जा सकती हैं (उदाहरण के लिए, ==बस वर्तमान लाइन को ठीक करता है)।

:set pasteपाठ में पेस्ट करने से पहले आप पाठ को पेस्ट करते समय इंडेंटेशन को अपरिवर्तित रखने के लिए , यह ऑटो-इंडेंटिंग टेक्स्ट से विम को रोक देगा जिसे आपने अभी पेस्ट किया है। सामान चिपकाने के बाद, आप अपना काम पूरा करने के बाद वापस जा सकते हैं set :nopaste। Vimdoc देखें यहाँ

यदि आप अपने आप को बार-बार सामान चिपकाते हैं, तो यह एक अच्छा विचार होगा कि इस टिप को VimWiki पर इस्तेमाल करें और इन पंक्तियों को अपने साथ जोड़कर "पेस्ट-मोड" टॉगल के लिए एक कुंजी सेट करें .vimrc:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

फिर आप <F2>पेस्ट-मोड को चालू करने के लिए हिट कर सकते हैं । vim शब्द "PASTE" को स्टेटस लाइन में दिखाएगा जब पेस्ट मोड सक्रिय होगा।


2
यह प्रश्न इंडेंटेशन के साथ कोड चिपकाने के बारे में नहीं है, यह खराब इंडेंट कोड को ठीक करने के बारे में है।
रॉफेल

4
मैंने आपके द्वारा पोस्ट की गई टिप्पणी नहीं देखी। हालाँकि, आप अभी भी gg=Gपूरी फ़ाइल को पुनः उपयोग करने के लिए उपयोग कर सकते हैं ।
भार्गव भट

@rolfl यह वह जगह है जहां मैं आमतौर पर ऐसे मामलों में शुरू करता हूं: gg=Gफिर उन हिस्सों को देखें जो vimगलत हो गए।
मूरू

यदि आप अधिक नियंत्रण चाहते हैं (या बार-बार होने वाली परेशानी को कम करते हैं) तो कोड को स्वरूपित करने के लिए एक ऑटो-कमांड जोड़ने पर विचार करें astyleजब आप एक बफर को सहेजते हैं। देखें इस जानकारी के लिए इतने पर सवाल।
भार्गव भट

2

एक लट या ब्रैकेटेड ब्लॉक के पूरे ब्लॉक को फिर से इंडेंट करने के लिए, अपने कर्सर को उसी लाइन पर रखें जहां ब्रैकेट है, और कोशिश करें =%। अपनी शिफ्ट की चौड़ाई बदलने के लिए, उदाहरण के लिए उपयोग करें :set sw=2

यदि यह काम नहीं करेगा के रूप में उम्मीद, मैन्युअल रूप से (मांगपत्र कम करने के लिए आउटडेंट ), कोशिश <%और साथ दोहराने .(यदि आवश्यक हो)। >%विपरीत के लिए उपयोग करें ।

इसलिए:

else
       {
         // some code
       }

हो जाता है:

else
{
  // some code
}

विशिष्ट कोड के लिए, एक पंक्ति या कुछ पंक्तियों को फिर से इंडेंट करने के लिए, कोशिश करें:

  • == वर्तमान लाइन को फिर से इंडेंट करने के लिए
  • 5== 5 लाइनों को फिर से इंडेंट करने के लिए

एक पंक्ति या कुछ पंक्तियों के लिए मैन्युअल रूप से इंडेंट बढ़ाने / घटाने के लिए, कोशिश करें:

  • << डी-इंडेंट वर्तमान स्थान को शिफ्ट-स्पेस रिक्त स्थान द्वारा
  • 5<< डी-इंडेंट 5 लाइनों को शिफ्ट करने के लिए रिक्त स्थान द्वारा
  • >> वर्तमान स्थान को इंडिपेंडेंस स्पेस द्वारा इंडेंट करने के लिए
  • 5>> 5 स्थान इंडेंट करने के लिए शिफ्ट स्पेस द्वारा
  • . यदि आवश्यक हो तो दोहराएं

आप vपाठ और प्रेस =(ऑटो-इंडेंट), <(डी-इंडेंट) या >(इंडेंट) का चयन करके दृश्य मोड ( ) में इंडेंटेशन भी कर सकते हैं ।

एक और चाल से पूरी फ़ाइल का सही खरोज के लिए है: gg=G

यदि आप रिक्त स्थान के स्थान पर टैब करते हैं, तो उपयोग करें: :retabजो सभी टैब को रिक्त स्थान से बदल देगा (देखें: रिक्त स्थान के साथ टैब को कैसे बदलें )।


बाहरी तरीकों के लिए, आप कोशिश कर सकते हैं:

  • pythonTidy पुनः स्वरूपित पायथन कोड, उदाहरण के लिए:

    :%!pythonTidy
    

सम्बंधित:


1

मैंने हाल ही में vim-pasta ( https://github.com/sickill/vim-pasta ) इंस्टॉल किया है , और जब मैं पेस्ट करता हूं तो कोड के इंडेंटेशन में सुधार होता है। README में विभिन्न कोड चिपकाने की रणनीतियों के बारे में भी कुछ अच्छी चर्चा है।


1

मौजूदा उत्तरों में पहले से ही बहुत सारी चीजें शामिल हैं। मैं सिर्फ एक मैपिंग जोड़ना पसंद करता हूं जिसका उपयोग मैं अक्सर इंडेंटेशन के लिए करता हूं।

nnoremap <Leader>i  mzgg=G`z

मैं इस मैप के साथ कुछ vimrc देखा है ===

किसी भी तरह से यह एक महान मानचित्रण है और मैं इसे लगभग हर बार उपयोग करता हूं, खासकर जब कोड को कहीं और से कॉपी किया जाता है।

या इससे भी बेहतर यह है autocmdकि डिस्क में परिवर्तन लिखने से ठीक पहले विम इसे संकेत देता है।

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