विम में नई लाइन हटाएं


271

क्या विम में एक पंक्ति के अंत में नई रेखा को हटाने का एक तरीका है, ताकि अगली पंक्ति वर्तमान रेखा से जुड़ी हो?

उदाहरण के लिए:

Evaluator<T>():
    _bestPos(){
}

मैं लाइनों को कॉपी किए बिना और उन्हें पिछले एक में चिपकाने के बिना यह सब एक लाइन पर रखना चाहता हूं। ऐसा लगता है कि मुझे अपने कर्सर को प्रत्येक पंक्ति के अंत में रखने में सक्षम होना चाहिए, एक कुंजी दबाएं, और अगली पंक्ति उसी कर्सर पर कूदें जिस पर कर्सर है।

अंतिम परिणाम:

Evaluator<T>(): _bestPos(){ }

क्या यह विम में संभव है?


विम के इन्सर्ट मोड में लाइन के अंत में डेल मेरे लिए काम करता था। हर टर्मिनल में नहीं, हालांकि।
विक्टर सर्जियनको

जवाबों:


584

यदि आप पहली पंक्ति पर हैं, तो दबाने (ऊपरी स्थिति) Jउस रेखा और अगली पंक्ति को एक साथ जोड़ देगा, नई रेखा को हटा देगा। आप इसे एक गिनती के साथ भी जोड़ सकते हैं, इसलिए दबाने 3Jसे सभी 3 पंक्तियों को एक साथ जोड़ दिया जाएगा।


29
जैसा कि एक अन्य जवाब में कहा गया है, gJरिक्त स्थान जोड़ने से बचेंगे जो विम का उपयोग करते समय जोड़ना चुन सकते हैं J
माइकल माइर

5
आप उन सभी लाइनों का भी चयन कर सकते हैं, जिनका आप उपयोग करना चाहते हैं V(विजुअल लाइन मोड) फिर प्रेस करें JयाgJ
Sbu

यदि आप कर्सर की स्थिति का उपयोग करना चाहते हैं :joinऔर :join!वह कर्सर स्थिति को बनाए रखते हुए लाइनों में शामिल हो जाएगा और जॉइनिंग पॉइंट पर कोई स्थान नहीं रखेगा। आप इसे मैप भी कर सकते हैं जैसे: nnoremap <Leader>j :joing<cr>और nnoremap <Leader>gj :join!<cr>
सर्जियोअराउजो

82

निश्चित रूप से। विम एक नई पंक्ति के रूप में \ n वर्ण को पहचानता है, इसलिए आप बस खोज और बदल सकते हैं। कमांड मोड प्रकार में:

:%s/\n/

1
धन्यवाद, लेकिन मैं एक वैश्विक खोज और प्रतिस्थापित नहीं करना चाहता।
derekerdmann

16
% हटाने से उस पर ध्यान जाता है। फिर यह केवल उस लाइन पर होगा जो कर्सर चालू है। वैकल्पिक रूप से, आप एक सीमा निर्दिष्ट कर सकते हैं जैसे: 11,15 s / \ n / (लाइनें 11-15) या:, + 7 s / \ n / (यह पंक्ति और अगले सात) या: -3, s / \ n / (पिछली तीन पंक्तियाँ और यह एक) ... आपको यह विचार मिलता है
ट्रिस्टन

1
या आप एक V-खंड का चयन कर सकते हैं और इसे बदल सकते हैं।
विक्टर सर्जेनको

51

जबकि सामान्य मोड में ऊपरी रेखा पर, हिट Shift+ j

आप एक गिनती भी पूर्व निर्धारित कर सकते हैं, इसलिए 3Jशीर्ष रेखा पर उन सभी लाइनों को एक साथ जोड़ देगा।


34

उल्लिखित अन्य उत्तरों के रूप में, (ऊपरी स्थिति) Jऔर खोज + को बदलने के लिए \nआम तौर पर न्यूलाइन वर्णों को अलग करने और लाइनों को समेटने के लिए उपयोग किया जा सकता है।

लेकिन अंतिम पंक्ति में अनुगामी न्यूलाइन वर्ण से छुटकारा पाने के लिए , आपको विम में यह करने की आवश्यकता है:

:set noendofline binary
:w

1
सवाल एक फ़ाइल के बीच में दो लाइनों को समाप्‍त करने के बारे में है - यह जवाब फ़ाइल के अंत में नई लाइन को हटा देता है, जो कि मैंने उसके बारे में नहीं पूछा है।
derekerdmann

3
इसने मेरे लिए काम किया। मैं विम के साथ सिंगल लाइन फ़ाइल के अंत में एक नई लाइन से छुटकारा पाने की कोशिश कर रहा था।
लोकेन

:set noendoflineबिना काम क्यों नहीं होता binary?
दोपहर

32

Jअतिरिक्त प्रमुख रिक्ति (यदि कोई हो) को हटाता है, एक ही स्थान के साथ लाइनें जोड़ रहा है। (कुछ अपवादों के बाद: /[.!?]$/दो स्थान डाले जा सकते हैं; पहले /^\s*)/, कोई स्थान नहीं डाला गया है।)

यदि आप उस व्यवहार को नहीं चाहते हैं, तो gJबस newline को हटा देता है और रिक्त स्थान के साथ कुछ भी चालाक नहीं करता है।


10

निम्नलिखित सभी मानते हैं कि आपका कर्सर पहली पंक्ति में है:

सामान्य मैपिंग का उपयोग करना:

3Shift+J

पूर्व आदेशों का उपयोग करना:

:,+2j

जिसका संक्षिप्त नाम है

:.,.+2 join

जिसे निम्नलिखित शॉर्टकट से भी दर्ज किया जा सकता है:

3:j

एक भी छोटी पूर्व कमान:

:j3

2
उन दोनों के बीच रिक्त स्थान के बिना:j!3
सर्जियोअराउजो

10
set backspace=indent,eol,start

अपने .vimrc में आप का उपयोग करने की अनुमति देगा backspaceऔर deleteपर \nडालने मोड में (newline)।

set whichwrap+=<,>,h,l,[,]

आपको पिछले एलएफ को सामान्य मोड में X(जब कॉल 1 में है) हटाने की अनुमति देगा ।


2

यह शायद आपकी सेटिंग्स पर निर्भर करता है, लेकिन मैं आमतौर पर ऐसा करता हूं A<delete>

Aलाइन के अंत में एपेंड कहां है। यह शायद nocompatibleमोड की आवश्यकता है :)


3
"मैं आमतौर पर ए <डिलीट> के साथ ऐसा करता हूं" हां, यही कारण है कि मैं यहां आया हूं; एक बेहतर तरीका खोजने के लिए;)। विम की पूरी बात आपके हाथ घर की पंक्ति से नहीं हट रही है।
ल्यूक

2
<CURSOR>Evaluator<T>():
    _bestPos(){
}

पहली पंक्ति में कर्सर

अब, सामान्य मोड में करते हैं

shift+v
2j
shift+j

या

V2jJ

: सामान्य V2jJ


1

मैं सिर्फ A को दबाऊंगा (पंक्ति के अंत में संलग्न, आपको सम्मिलित मोड में डालता है) उस पंक्ति पर जहां आप नई पंक्ति को हटाना चाहते हैं और फिर हटाएं दबाएं।


अफसोस की बात है, यह मेरे लिए काम नहीं करता है; यह एक पैंटी सेटिंग हो सकती है जिसे मैंने याद किया है।
derekerdmann

2
शायद vi बैकस्पेस विकल्प::help 'backspace'
ग्लेन जैकमैन

1

यदि आपको अन्य शेल टूल्स का उपयोग करने में कोई आपत्ति नहीं है,

tr -d "\n" < file >t && mv -f t file

sed -i.bak -e :a -e 'N;s/\n//;ba' file

awk '{printf "%s",$0 }' file >t && mv -f t file

7
यह ओवरकिल की तरह है, क्या आपको नहीं लगता?
derekerdmann

नहीं यह नहीं। आपको क्यों लगता है कि यह ओवरकिल है? इसे विम के अंदर करना मैनुअल है। यह इस बात पर निर्भर करता है कि क्या आप इसे हर बार हाथ से करना चाहते हैं, या बस इन एक लाइनरों को एक झटके में पूरा करने के लिए निष्पादित करें। विम एक संपादक हैं। और कोई भी उपकरण जो फाइलों को संसाधित कर सकता है, मूल रूप से भेस में "संपादक" हैं।
भूतडोग Oct४

5
अभी भी vim और उपयोग में फ़ाइल को खोलना आसान है ggVGJ
बहुत ज्यादा php

यकीन है, अगर आपको हर बार ऐसा करना आसान लगता है, तो आपको उस तरह से डेटा बदलने की जरूरत है। आगे बढ़ें। इसके अलावा, एक बड़ी फ़ाइल पर ऐसा करने का प्रयास करें।
भूतडोगरा ghost

मैं फ़ाइलों का एक गुच्छा संसाधित नहीं कर रहा हूँ; मैं कोड की कुछ पंक्तियों को संघनित करके काम कर रहा हूं।
derekerdmann

1

समस्या यह है कि चर 0A (\ n) है जो अदृश्य हैं, संचित हो सकता है। मान लें कि आप पंक्ति 100 से अंत तक सफाई करना चाहते हैं:

टाइपिंग ईएससी और: (टर्मिनल कमांडर)

:110,$s/^\n//

एक स्क्रिप्ट में:

execute '110,$s/^\n//'

व्याख्या: ११० से अंत तक नई लाइन से शुरू होने वाली लाइनों के लिए खोज (रिक्त है) और उन्हें हटा दें

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