vim - लाइनों की गिनती के बिना पाठ के एक बड़े ब्लॉक को कैसे हटाएं?


193

विम में, मैं अक्सर खुद को पाठ के बड़े ब्लॉक को हटा (या कॉपी) पाता हूं। कोई व्यक्ति 50dd50 पंक्तियों को हटाने के लिए पाठ की पंक्तियों की गणना कर सकता है (उदाहरण के लिए) ।

लेकिन पाठ के इस बड़े ब्लॉक को कोई कैसे हटाएगा बिना यह जाने कि कितनी लाइनों को हटाना है?


1
यदि खिड़की काफी बड़ी है, तो रिश्तेदार लाइन नंबरिंग यहां सहायक है। कर्सर को खिड़की के शीर्ष पर रखें, हटाए जाने वाली अंतिम पंक्ति की सापेक्ष रेखा संख्या ढूंढें (कहते हैं, n), एक जोड़ें, फिर उस संख्या को टाइप करें, फिर dd टाइप करें। जैसे अगर n = 50, तब 51dd। वैकल्पिक रूप से, मोशन कमांड का उपयोग करें -50d<down arrow>
BallpointBen

"सापेक्ष रेखा संख्या ज्ञात करें" - या, उपयोग करें :set rnuऔर विम यह तुरंत करेगा! आप जिस लाइन पर हैं, वह अभी भी पूरी तरह से क्रमांकित होगी, लेकिन कर्सर के ऊपर और नीचे की रेखाएं सममित रूप से 1, 2, ... (और कर्सर आंदोलन, फ़ाइल-स्तरीय घटनाओं आदि के साथ अद्यतन) की संख्या होगी
जॉन पी

जवाबों:


287

मैं कोई भी गुरु नहीं हूं, लेकिन इस परिस्थिति में मैं जो उपयोग करता हूं वह "दृश्य विधा" है। कमांड मोड में, टाइप करें V(कैपिटल)। तब हटाए गए ब्लॉक को हाइलाइट करने के लिए ऊपर / नीचे जाएं (सभी सामान्य आंदोलन कमांड काम करते हैं)। फिर इसे xया के साथ हटा दें d


2
अजीब। मुझे पता है कि यह काम करता है मेरे लिए (tm) यहाँ लिनक्स पर (vim 7.3.50) और विंडोज पर gVim के साथ। और अन्य उत्तरों को देखते हुए, अन्य लोगों के लिए काम करता है। हो सकता है कि आपकी कुछ सेटिंग्स .vimrcइस पर काम कर रही हों?
Mat

ठीक है, किसी कारण से मुझे महसूस नहीं हुआ कि आप विज़ुअल लाइन मोड का उपयोग करके प्रवेश कर सकते हैं Shift- v... मैं CTRLकुंजी का उपयोग करने की कोशिश कर रहा था । तो यह काम करता है और शायद सबसे सुविधाजनक तरीका है।
जस्टिन एथियर

7
आप स्पष्ट करना चाह सकते हैं कि दो दृश्य मोड हैं - विजुअल लाइन ( CTRL- v) और विजुअल ब्लॉक ( Shift- v)।
जस्टिन एथियर

2
मैं यह बहुत कुछ करता हूं। लेकिन मैं हमेशा इसे धोखा और कम-से-आदर्श विम मानता हूं।
जिम मिचनर

9
वास्तव में तीन विज़ुअल मोड हैं: विजुअल मोड (कैरेक्टर आधारित {v}), विजुअल लाइन मोड (लाइन आधारित {Sv}) और विजुअल ब्लॉक मोड (ब्लॉक के चयन की अनुमति देता है {Cv})
टॉम रेजनर

293

प्रारंभिक लाइन पर जाएं और टाइप करें ma("a")। फिर अंतिम पंक्ति पर जाएं और दर्ज करें d'a("ए" चिह्नित करने के लिए हटाएं)।

यह वर्तमान से चिह्नित (समावेशी) तक सभी लाइनों को हटा देगा। यह भी साथ संगत है viऔर साथ ही vim, बंद मौका है कि अपने पर्यावरण उत्तरार्द्ध के साथ ही धन्य नहीं है पर।


3
यह पागल चट्टानों! इससे पहले कि मैं बेहतर समाधान में तलाश करूं, मैं नफरत करता हूं कि मैं कब तक कुछ कर सकता हूं (जैसे कि लाइनें गिनना)। धन्यवाद!
ryanjdillon

1
सचमुच कमाल मैं हमेशा ब्लॉक को हटाने के लिए दृश्य मोड का उपयोग कर रहा हूँ, लेकिन इस तरह से बेहतर +1 है
Hish

4
मैं 500k + लाइनों को हटाने के लिए दृश्य मोड की तुलना में यह अधिक उपयोगी पाया गया
माइकल - जहां क्ले शिर्की

वास्तव में व्यावहारिक जवाब। मैं इसका उपयोग /var/mail/usernameबल्क में फ़ाइल से अपने सर्वर में मेल्स को हटाने के लिए करता हूं , और आखिरी मेल्स को बरकरार रखने के लिए। मैं एक निशान करता हूं, फिर मैं उदाहरण के लिए दर्ज करता हूं, इसके 50000बाद ggलाइन 50.000 पर जाती है, फिर मैं सभी लाइनों को बीच में हटा देता हूं। एक जादू की तरह काम करता है!
otmezger

1
@ हॉर्ता, मैं शायद vimगीगाबाइट फ़ाइलों के संपादन के लिए एक उपकरण के रूप में उपयोग नहीं करूंगा - मैं टेक्स्ट प्रोसेसिंग टूल जैसे कि awkऔर उसके ब्रेथ्रेन के लिए विकल्प चुनूंगा :-)
paxdiablo

46

आप vip vapपैरा का उपयोग कर सकते हैं (कुछ कमांड डिलीट ऑप्शन के साथ भी प्रयोग करने योग्य हैं) , पैरा v2apका चयन करने के लिए, दो पैराग्राफ dapकार्यों का चयन करने के लिए d2apभी। आप [ ]जैसे ब्लॉक के भीतर हटा सकते हैंda[

संदर्भ के लिए: वस्तुओं के प्रकार। Vim प्रलेखन से: अनुभाग 4. http://vimdoc.sourceforge.net/htmldoc/visual.html

4. Operating on the Visual area             *visual-operators*

...    
The objects that can be used are:
aw  a word (with white space)           
iw  inner word                  
aW  a WORD (with white space)           
iW  inner WORD                  
as  a sentence (with white space)           
is  inner sentence                  
ap  a paragraph (with white space)          
ip  inner paragraph                 
ab  a () block (with parenthesis)           
ib  inner () block                  
aB  a {} block (with braces)            
iB  inner {} block                  
a<  a <> block (with <>)                
i<  inner <> block                  
a[  a [] block (with [])                
i[  inner [] block                  

1
दा [, दा {, दा "सभी प्रोग्रामर के लिए उपयोगी है
रेने वोलेर

1
धन्यवाद! dap"पैराग्राफ हटाएं" के रूप में याद रखना बहुत आसान है
ट्रोपिलियो

38

यहां कई बेहतर उत्तर हैं, लेकिन पूर्णता के लिए मैं उस विधि का उल्लेख करूंगा जिसका उपयोग मैंने ऊपर वर्णित कुछ महान उत्तरों को पढ़ने से पहले किया था।

मान लीजिए आप लाइनों से 24-39 हटाना चाहते हैं। आप पूर्व कमांड का उपयोग कर सकते हैं

:24,39d

तुम भी लाइनों का उपयोग कर सकते हैं

:24,39y

और 24-39 से अधिक लाइनों का उपयोग करके खोजें और बदलें

:24,39s/find/replace/g

11

यदि आप लाइन नंबरों को अपने माध्यम से चालू set numberकर सकते हैं, तो बस dNNGएनएन को वर्तमान स्थिति से हटा देगा। इसलिए आप उस पंक्ति के प्रारंभ में नेविगेट कर सकते हैं जिसे आप हटाना चाहते हैं और बस d50Gयह मान लेना कि वह अंतिम पंक्ति है जिसे आप हटाना चाहते हैं।


10

यह इस बात पर निर्भर करता है कि बड़ा ब्लॉक क्या है। हो सकता है कि आप बस एक पैराग्राफ को डिलीट करने की स्थिति में हों, जिस स्थिति में आप ऐसा dipकरेंगे।


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

1
मैं कोड के साथ भी काम कर रहा हूं, और मैं एक खाली लाइन द्वारा तार्किक ब्लॉकों को अलग करता हूं। इस टिप ने मेरा दिन बना दिया। मैं अब तीन कीस्ट्रोक्स के साथ तर्क के बड़े ब्लॉक को हटा सकता हूं।
3

यह काम करता है क्योंकि 'd' का अर्थ है हटाना, इस संदर्भ में 'p' का अर्थ है पैरा
user98761

7

कई संभावनाएं हैं, आपके द्वारा काम किए जाने वाले पाठ पर सबसे अच्छा क्या निर्भर करता है।

दो संभावनाएं दिमाग में आती हैं:

  • दृश्य मोड में स्विच ( Vऔर S-V, ...), कर्सर आंदोलन के साथ पाठ का चयन करें और दबाएंd
  • इसके साथ एक संपूर्ण पैराग्राफ़ हटाएं: dap

मैं अब बहुत बार डीएपी का उपयोग करता हूं, जिसके बारे में मैं जानता हूं और इसे डिस और डिप करना पसंद करता हूं, लेकिन, यह हमेशा ब्लॉक के बाद आने वाली एक ब्लॉक और रिक्त लाइन को हटा देता है, लेकिन ब्लॉक और रिक्त लाइन को हटाने का एक तरीका है इसके पहले आता है?
फनकोड्बैट

पैराग्राफ के साथ एक पाठ के बीच में परिणाम में कोई वाक्यात्मक अंतर नहीं है, है? अगर वहाँ है, तो मैं एक नए प्रश्न में, उदाहरण के साथ, आप क्या चाहते हैं, यह लिखने का सुझाव देता हूं।
टॉम रेगनर

6

यदि स्क्रीन पर पूरा ब्लॉक दिखाई दे रहा है, तो आप relativenumber सेटिंग का उपयोग कर सकते हैं। देखें: relativenumber की मदद करें। 7.3 में उपलब्ध है


मुझे पता ही नहीं चला कि मैं कितना उपयोगी था: जब तक मैंने इसका इस्तेमाल शुरू नहीं किया था - तब तक 50dd के साथ-साथ नेविगेशन, 50j
rshdev

3

आप अपने कर्सर को ब्लॉक की शुरुआत या अंत में रख सकते हैं और विजुअल मोड (शिफ्ट-वी) दर्ज कर सकते हैं। तब तक बस ऊपर या नीचे जाएं जब तक वांछित ब्लॉक हाइलाइट नहीं किया जाता है। अंत में, y दबाकर टेक्स्ट को कॉपी करें या d दबाकर टेक्स्ट को काटें।


शायद अजीब है, लेकिन इससे मुझे पता चला कि एक पंक्ति में कुछ वांछित मध्य बिंदु से पाठ का चयन कैसे करें और प्रत्येक पंक्ति के अंत में एक ही बिंदु पर नीचे कई पंक्तियों का चयन करें। ठीक वही जो मेरे द्वारा खोजा जा रहा था।
नानकर

3

अन्य गतियों के साथ जो पहले से ही यहां बताए गए हैं, /{pattern}<CR>गति भी है, इसलिए यदि आप जानते हैं कि आप उस पंक्ति को हटाना चाहते हैं जिसमें फू है, तो आप कर सकते हैं dV/foo<CR>Vयहाँ गति को लाइन-वार करने के लिए बाध्य किया जाता है क्योंकि डिफ़ॉल्ट रूप से चरित्रवान /होता है।


3

मेरे लिए गिनती की रेखाएँ बहुत थकाऊ हैं, लेकिन 'पैराग्राफ' को गिनना इतना बुरा नहीं है। '{' और '}' कर्सर को क्रमशः कर्सर से पहले और बाद में पहली खाली लाइन पर ले जाते हैं। कर्सर के संचालन के संचालन को विलोपन के साथ जोड़ा जा सकता है, और कई अन्य उत्तरों में एक समान दृष्टिकोण (एक पंक्ति के लिए dd, दस्तावेज़ के अंत के लिए dG, आदि) का उपयोग किया जाता है।
उदाहरण के लिए:

/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */

Lorem *ipsum(void) {
  return dolor(sit, amet);
}

यदि आपका कर्सर टिप्पणी ब्लॉक के ऊपर शुरू होता है, तो 'd' 'टिप्पणी ब्लॉक को हटा देता है, और' d2} 'टिप्पणी ब्लॉक और कोड ब्लॉक दोनों को हटा देता है। यदि आपका कर्सर कोड ब्लॉक के नीचे शुरू होता है, तो 'd {' कोड को हटा देता है, और 'd2 {' दोनों को हटा देता है। बेशक, आप पहले कर्सर को ले जाकर एक ब्लॉक को छोड़ सकते हैं: '{d {' या '} d}'।

यदि आप अपने व्हाट्सएप के अनुरूप हैं, या आप पैराग्राफ को एक नज़र में गिन सकते हैं, तो यह काम करना चाहिए। यदि आप रुचि रखते हैं तो विम मदद फ़ाइल में अधिक कर्सर चालें हैं।


1

आप बहुत बड़ी संख्या में भी प्रवेश कर सकते हैं, और ddयदि आप कर्सर के नीचे की सभी पंक्तियों को हटाना चाहते हैं तो दबाएं ।


यह उपयोग करने के लिए और भी आसान हो सकता है dG, जो दस्तावेज़ के अंत तक हटा देता है, Gअंतिम पंक्ति में जाने के लिए चूक के रूप में ।
andyg0808

1

पाठ का एक ब्लॉक हटाना

अपने कर्सर को ब्लॉक की शुरुआत में मानता है:

V/^$<CR>d (where <CR> is the enter/return key)

व्याख्या

  • "Linewise-visual" मोड दर्ज करें: V
  • अगली खाली पंक्ति तक हाइलाइट करें: /^$<CR>
  • हटाएँ: d

कुंजी बंधन

अधिक मजबूत समाधान:

:set nowrapscan
:nnoremap D V/^\s*$\\|\%$<CR>d

व्याख्या

  • खोज रैप अक्षम करें: :set nowrapscan
  • Dकुंजी को रीमैप करें (निम्न आदेशों पर)::nnoremap D
  • "Linewise-visual" मोड दर्ज करें: V
  • अगली खाली / व्हाट्सएप लाइन या EOF तक हाइलाइट करें: /^\s*$\\|\%$<CR>
  • हटाएँ: d
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.