विम - लाइनों के बीच खाली लाइन जोड़ना


15

मैं हर गैर-रिक्त लाइनों के बीच एक रिक्त रेखा कैसे डालूं?

जैसे। से

line 1
line 2
line 3

line 4
line 5

सेवा

line 1

line 2

line 3

line 4

line 5

जवाबों:


28

विम: जी कमांड को इस तरह के कार्य के लिए डिज़ाइन किया गया है; हर लाइन पर एक एकल क्रिया चल रही है जो एक विशेष पैटर्न से मेल खाती है। यहाँ मेरा जवाब है:

:g/.\n\n\@!/norm o

पैटर्न मैं उपयोग कर रहा हूँ /.\n\n\@!/। इसके घटक टुकड़ों में तोड़कर:

  • .लाइन में किसी भी वर्ण से मेल खाता है। (विचार से किसी भी मौजूदा खाली लाइनों को तुरंत त्यागने के लिए इस्तेमाल किया जाता है)
  • \n ऊपर के वर्ण के अंत में एक एकल \ n मेल खाता है
  • \n\@! मैच को विफल कर देता है अगर पहले वाले \ n के तुरंत बाद दूसरा \ n है।

( रेगुलर एक्सप्रेशंस में ऐसे ही और स्पेसिफिक मैचर्स के :h E59बारे में अधिक जानकारी के लिए जाँच करें \@!- एक कपल और भी हैं!)

तो: g कमांड के regex ने अब प्रत्येक गैर-रिक्त रेखा का चयन किया है, जिसे एक एकल पंक्ति द्वारा समाप्त किया गया है, और जिसके बाद एक खाली पंक्ति नहीं है।

एक :gस्टेटमेंट में पैटर्न के बाद मिलान लाइनों पर चलने के लिए कमांड आती है। इस मामले में, मैंने इसे एक सामान्य मोड कमांड (संक्षिप्त में norm) निष्पादित करने के लिए कहा है , और चलाने के लिए कमांड बस है o, जो वर्तमान लाइन के नीचे एक खाली लाइन सम्मिलित करता है।

तो एक साथ लिया गया, कमांड हर लाइन को ढूंढता है जिसके नीचे एक खाली लाइन नहीं है, और एक जोड़ता है। और यह सब वहाँ है! आप अधिक फैंसी चीजों के साथ (और यह नकारात्मक बहन है ) कर सकते हैं के लिए vim wiki की पावर ऑफ जी लेख की जांच करना पसंद कर सकते हैं - यह उन आश्चर्यजनक उपयोगी कमांडों में से एक है जो आप जल्द ही भरोसा करने के लिए बढ़ते हैं, और फिर संपादकों में बहुत याद आते हैं जिसके पास नहीं है।:g:v


1
यकीनन। मैं आमतौर पर आशुलिपि की तरह देखता हूं, :%norm oलेकिन यह पता चलता है कि इस मामले में काम नहीं करता है o। +1
sehe

टाइप करें :%s/$/, फिर हिट करें ^V, फिर हिट करें Enter
jpaugh

1
@jpaugh मान लें कि आप का मतलब है :%s/$/<C-V><CR><CR>(keypress के आम vim- लोक एन्कोडिंग का उपयोग करने के लिए), कि दृष्टिकोण बस प्रत्येक पंक्ति के बाद एक नई पंक्ति जोड़ता है। यही है, वे रेखाएँ जो पहले से ही ब्लॉक्स से अलग हो चुकी हैं (देखें पंक्ति 3 -> लाइन 4, उदाहरण पाठ में) अतिरिक्त रिक्त लाइनें प्राप्त करने के लिए हवा। मूल प्रश्न अतिरिक्त रिक्त लाइनों को जोड़ने से बचने के लिए था जहां वे पहले से ही शुरुआती पाठ में मौजूद थे।
ट्रेवर पॉवेल

3

जब मैंने @ NeilForester की वैश्विक खोज और प्रतिस्थापित उत्तर का परीक्षण किया, तो मैंने पाया कि यह हर दूसरे इच्छित प्रतिस्थापन को लगातार गैर-रिक्त लाइनों में याद करती है यदि लाइनों में प्रत्येक में केवल एक ही वर्ण होता है। ऐसा प्रतीत होता है कि पैटर्न के कारण प्रत्येक अवसर पर पिछले चरित्र से मेल खाने के बाद शुरू होता है ।

लुकबाइंड और लुकहेड का उपयोग करने से यह समस्या हल हो जाती है और रेगेक्स थोड़ा छोटा हो जाता है:

:%s/\n\@<!\n\n\@!/\r\r/g

धन्यवाद! यह काम करता है, और अगर मैं फिर से खोज चलाता हूं, तो यह अधिक लाइनें नहीं जोड़ता है (यदि कहें, तो मैंने अपनी फ़ाइल में नई लाइनें जोड़ी हैं)।

1
क्या आप बता सकते हैं कि खोज पैटर्न में प्रत्येक रेगेक्स का क्या मतलब है? विम मदद को देखते हुए, \n\@<!\nकिसी भी लाइनब्रेक का मतलब है कि एक और लाइनब्रेक के बाद यह सही नहीं है? लेकिन मैं समझ नहीं पाया कि \n\@!इसका क्या मतलब है। मैं इसे समझना चाहूंगा ताकि मैं इसे अन्य खोज पैटर्न पर

हां, \n\@<!\nइसका मतलब है कि कोई भी लाइनब्रेक जो किसी अन्य लाइनब्रेक का तुरंत पालन नहीं करता है। \n\@!शून्य चौड़ाई के साथ मेल खाता है यदि पूर्ववर्ती परमाणु (जैसे \n) जो कुछ भी होता है उससे ठीक पहले मेल नहीं खाता। :help \@<!इस पर प्रलेखन देखने की कोशिश करो । I
साइमन

3

दूसरा रास्ता:

%s/\(.\)\n\(.\)/\1\r\r\2/

जिसका मतलब है,

\(.\) match and capture a non-newline character,
\n    match a newline
\(.\) match and capture a non-newline character

इसके साथ बदलें: पहला कैप्चर, डबल न्यूलाइन, और दूसरा कैप्चर।

उदाहरण के लिए, में line1\nLine2परिणाम \1 = 1और \2 = L


0

अगर मैं ग़लत हूं तो मेरी गलती सुझाएं। मेरा मानना ​​है कि जब आप कमांड मोड का उपयोग करते हैं तो लाइन के नीचे जाने के लिए आप अक्षर k का उपयोग करते हैं। फिर इन्सर्ट मोड डालें और अगली लाइन जोड़ें। आवश्यक के रूप में दोहराएं? उम्मीद है की यह मदद करेगा!


kएक लाइन चलती है। jएक पंक्ति नीचे जाती है।
नील फॉरेस्टर

हाँ, वास्तव में यह करता है। मेरी गलती। धन्यवाद नील!

0
/[^\n]\n[^\n]
:map <F2> no<esc><F2>

फिर दबाएं <F2>। यह लगातार दो गैर-रिक्त लाइनों की खोज करेगा, और फिर उनके बीच एक पंक्ति को बार-बार जोड़ देगा।

संपादित करें:

एक एकल, वैश्विक खोज और प्रतिस्थापित करने के लिए यह एक वैकल्पिक तरीका है:

:%s/\([^\n]\)\n\([^\n]\)/\1\r\r\2/g

मेरी फ़ाइल में बहुत सारी लाइनें हैं। वहाँ एक तरीका है एक regex खोज और पूरी फ़ाइल के लिए रिक्त पंक्ति सम्मिलित करें? मैं stackoverflow.com/questions/2673209/… को देख रहा हूँ, लेकिन समझ नहीं सका कि सभी regex कमांड्स का क्या मतलब है।

एक ही चीज़ को एक ही कमांड में पूरा करने के लिए एक वैकल्पिक तरीके के लिए, और एक पुनरावर्ती मानचित्रण के बिना मेरा उपरोक्त संपादन देखें। पहला तरीका पूरी फाइल के लिए काम करना चाहिए।
नील फॉरेस्टर

0

इस आदेश ( 16वर्ण) का प्रयास करें :

:%!sed G|cat -s

"विमगॉल्फ" को एक छोटी कमांड बनाने के प्रयास के बजाय, उपयोग किए जाने वाले अस्पष्ट विकल्पों का थोड़ा स्पष्टीकरण अधिक सहायक होगा।
इंगो करकट

0

मुझे नहीं पता कि आपकी फ़ाइल कितनी लंबी है, लेकिन सबसे सरल विधि oमें से एक कमांड मोड में है। और अगली पंक्ति में .। यह सरल मैक्रो को लोड किया जा सकता है।

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