2-स्पेस इंडेंट को 4-स्पेस में vim में बदलें


93

मैंने कुछ कोड इंटरनेट से कॉपी किए हैं जिनमें 2-स्पेस इंडेंटिंग है और मैं इसे 4-स्पेस इंडेंटिंग में बदलना चाहता हूं। मुझे आश्चर्य होता है कि क्या विम स्क्रिप्ट लिखने के बिना कार्य को पूरा करने के लिए एक छोटी सी विम दिनचर्या है? यहां बताया गया है कि वर्तमान में मैं इसे HTML फ़ाइल के साथ कैसे कर रहा हूं:

  • एक मैक्रो रिकॉर्ड करें
  • एक पंक्ति की शुरुआत में जाएं
  • "<" की पहली घटना तक दृश्य सभी व्हाट्सएप का चयन करें
  • सभी व्हाट्सएप को Yank और पेस्ट करें (मूल रूप से उन्हें डबल करने के लिए)
  • फ़ाइल के अंत तक मैक्रो को फिर से चलाएँ

संक्षेप में qa0vt<yp<esc>jq

नुकसान:

मैक्रो एक रिक्त रेखा या एक पंक्ति के लिए विफल रहता है जो "<" से शुरू नहीं होता है। और मुझे नहीं पता कि इस समाधान को गैर-HTML फ़ाइल में कैसे बढ़ाया जाए।

जवाबों:


174

टैबस्टॉप को बदलकर इंडेंट बदलने का एक सामान्य तरीका है:

अपनी फ़ाइल को एक खाली बफर में चिपकाएँ, फिर:

:set ts=2 sts=2 noet
:retab!

यह प्रत्येक 2 रिक्त स्थान को TAB वर्ण में बदलता है, फिर:

:set ts=4 sts=4 et
:retab

यह हर TAB को 4 स्थानों में बदलता है।

इस पद्धति का लाभ यह है कि आप इसे दूसरे तरीके से भी उपयोग कर सकते हैं, उदाहरण के लिए 4 से 2 रिक्त स्थान में परिवर्तित करने के लिए।


16
@ XavierT.I वास्तव में लगता है कि इस जवाब को समझना बहुत आसान है। और शायद यह और अधिक स्पष्ट करता है, तो कम आदेश नाम उनके पूरे नाम के साथ की जगह है हो जाएगा: ts: = tabstop, sts: = softtabstopऔर [no]et: = [no]expandtab
योजि

किस स्थिति में retabतर्क उपयोगी होगा, और हम इस कार्य के लिए इसका उपयोग क्यों नहीं कर सकते हैं?
joeytwield

@joeytwiddle जैसा कि मैं इसे समझता हूं, आप इसका उपयोग कर सकते हैं और इस उत्तर को उसी प्रभाव के रूप में प्राप्त कर सकते हैं , :set sts=2 noetऔर :retab! 2इसलिए यह थोड़ा कम होगा (यद्यपि यह शायद कम पठनीय है)।
दान बकर

यह विधि लाइन की शुरुआत के बजाय स्ट्रिंग-शाब्दिक और अन्य स्थानों के भीतर 2-रिक्त स्थान को 4-स्थान में बदल देती है।
nacitar sevaht

3
उन सभी को एक साथ रखें: :set ts=2 sts=2 noet | retab! | set ts=4 sts=4 et | retab!और फिर @:एक ही क्रिया को जल्दी से लागू करने के लिए विभिन्न फ़ाइलों में उपयोग करें ।
L__

59

यह :set shiftwidth=4और के साथ संभव हो सकता है gg=G


ध्यान दें कि यदि यह काम नहीं करता है, तो आपके पास एक मोड सक्षम हो सकता है जिसमें इंडेंटेशन पर कुछ अन्य प्रभाव हो।
दाव क्लार्क

1
हालांकि यह सवाल एक सामान्य समाधान के बारे में नहीं है, कृपया ध्यान दें कि यह हमेशा काम नहीं करता है, विशेष रूप से अजगर कोड के साथ।
0xc0de

5
gg=Gबाह्य रूप से क्या मतलब है? मैं समझता हूं कि ggइसका मतलब है "1,1 पर जाएं", और Gइसका अर्थ है "अंतिम पंक्ति में जाना"।
जोनाथन रेनहार्ट

5
@JonathonReinhart इंडेंटिंग =करता है, इसलिए इसका मतलब सिर्फ इंडेंट से लेकर टेक्स्ट के अंत तक होना है
alex

से बेहतर काम किया है %retab, जो गलत रूप से परिवर्तित रिक्त स्थान स्ट्रिंग शाब्दिक के अंदर एम्बेडेड है।
अलनीतक

34

मैं जो कुछ भी करता हूं वह एस्केनर और कॉफबिश के दृष्टिकोण के समान है, लेकिन टाइप करने के लिए थोड़ा तेज है:

:%s/^\s*/&&

बस प्रमुख स्थान (रिक्त स्थान या टैब) को दो बार उतना ही अग्रणी स्थान देता है ( &मिलान अभिव्यक्ति के साथ प्रतिस्थापित किया जाता है)।


2
यह आसान है क्योंकि यह दृश्य चयन (वी) के साथ काम करता है, बस ड्रॉप करें %
ट्रेवर रॉबिन्सन

1
मुझे यह अच्छी तरह से पसंद है b / c यह किसी भी मैनुअल के साथ गड़बड़ नहीं करता है जो मुझे टिप्पणियों आदि में हैं
स्टीफनम

@TrevorRobinson शीर्ष दो उत्तर भी श्रेणियों पर काम करते हैं।
ब्रायन मैक्किऑन

यह भी है अतिरिक्त लाभ आप का उपयोग करने के लिए इसे बाहर का विस्तार कर सकते हैं कि sedऔर एक निर्देशिका में सभी फाइलों पर लागू superuser.com/a/159286/41494
icc97

3

मैंने इस नियमित अभिव्यक्ति का उपयोग किया (यह प्रमुख स्थानों की संख्या को दोगुना करता है):

%s;^\(\s\+\);\=repeat(' ', len(submatch(0))*2);g

%s/\s\+/&&/एक ही काम नहीं करता है? Btw, मुझे लगता है कि gझंडा अनावश्यक है (एक के लिए, ^patternहर पंक्ति में केवल 1 मैच होगा , नहीं?)
डबलडाउन

'और' इंगित करने के लिए धन्यवाद। मुझे आपके मुख्य रूप से थोड़ा सुधार है क्योंकि आप '^' %s/^\s\+/&&/gको भूल गए हैं।
काटें

1
यह स्प्रो के उत्तर के समान है, लेकिन मैं इस उत्तर की सराहना करता हूं क्योंकि यह आपको आसान बनाने की अनुमति देता है यदि आपको कुछ और अधिक जटिल करने की आवश्यकता है।
स्टीफन मिमी

3

यह एक बहुत पुराना प्रश्न है, हालाँकि सभी उत्तर गलत हैं ... विम के पास पूरी फाइल को रेंडर करने का एक बहुत ही आसान तरीका है। मैंने इसे करने के लिए अपना कार्य लिखने के बाद यह सीखा, इसलिए मैं उसी अज्ञानता की नाव में हूं;)

प्रकार

gg=G

यह मानकर चल रहा है कि आपके पास अपना टैबस्टॉप सेट है जो आपको पसंद है, (इसलिए ओपी के लिए यह ts = 4 होगा)

मैंने इसे http://vim.wikia.com/wiki/Fix_indentation से सीखा , जिसमें उल्लेख है

सामान्य मोड में, gg = G टाइप करने से पूरी फ़ाइल पुनः आ जाएगी। यह एक विशेष मामला है; = एक ऑपरेटर है। D या y की तरह, यह किसी भी पाठ पर कार्य करेगा जिसे आप कर्सर गति कमांड के साथ आगे बढ़ाते हैं। इस स्थिति में, gg कर्सर को पहली पंक्ति में रखता है, फिर G कर्सर को वर्तमान कर्सर स्थिति से बफर के अंत तक फिर से भेज देता है।


2
1. यदि आप नीचे तक सभी तरह से स्क्रॉल करते हैं, तो आपको एक उत्तर दिखाई देगा gg = G। 2. यह हमेशा काम नहीं करता है।
लिम एच।

1

Cforbish के उत्तर के समान (लेकिन कुछ हद तक सरल), यह रेगेक्स प्रमुख स्थानों की नकल करेगा

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

या आप 2-रिक्त स्थान को 4-रिक्त स्थान में बदलने के लिए इस अन्य रेगेक्स का उपयोग कर सकते हैं, एकल रिक्त स्थान (और सामान्य रूप से विषम मात्रा) को संरक्षित कर सकते हैं

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

अर्थात्,

  • 1 अंतरिक्ष ⇢ 1 अंतरिक्ष
  • 2 स्थान ⇢ 4 स्थान
  • 3 रिक्त स्थान ⇢ 5 रिक्त स्थान
  • 4 रिक्त स्थान ⇢ 8 रिक्त स्थान

1

@ स्प्रो के जवाब के अलावा, मैंने इसे अपने में डाल दिया .vimrc

command! -range=% Format :<line1>,<line2>s/^\s*/&&

बस टाइप करें :Format

दृश्य चयन के साथ, यह केवल चयनित लाइनों को प्रारूपित करता है।

दृश्य चयन के बिना, यह पूरी फ़ाइल को प्रारूपित करता है।


0

यह रेगेक्स आधारित उत्तरों का एक प्रकार है।

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

$ cat ~/bin/dblsp
#!/bin/bash

file=${1--}

while IFS= read -r line; do
    echo "$line" | sed 's/\s*/&&/'
done < <(cat -- "$file")

मैं इसे विज़ के भीतर एक लाइन का चयन करके और निम्नलिखित आदेश जारी करके उपयोग करता हूं:

:'<,'>!dblsp

यह मुझे regex टाइप करने (या याद रखने) की आवश्यकता को बचाता है।

मैं इसे निम्न जैसे मानचित्रों में भी उपयोग करता हूं:

nnoremap <leader>] `[V`]!dblsp<CR>

जो इसे हाल ही में चिपकाए गए पाठ के ब्लॉक पर लागू करेगा। मैं आमतौर पर निम्नलिखित मानचित्र का उपयोग करने के बजाय चिपकाने के लिए करता हूं:set paste

nnoremap <leader>p :r !xclip -o<CR>

मेरा सामान्य वर्कफ़्लो है:

  • कोड स्निपेट चुनें (उदाहरण के लिए इस पृष्ठ पर कोड 2 रिक्त स्थान है, लेकिन मुझे 4 चाहिए)
  • पेस्ट कोड स्निपेट (,, पी)
  • परिवर्तन रिक्ति (,))

या बस दूसरे बफ़र से चिपकाए गए yanked ब्लॉकों पर इंडेंट को बदलना।

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