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


91

विम में, मुझे अक्सर पाठ के बड़े ब्लॉक को हटाने या यांक करने की आवश्यकता होती है।

मैं टेक्स्ट की पंक्तियों को गिन सकता हूं और 50dd50 लाइनों को हटाने के लिए कुछ दर्ज कर सकता हूं ।

लेकिन यह थोड़ा दर्द है। मैं यह जानने के बिना पाठ के इस बड़े ब्लॉक को कैसे हटा सकता हूं कि अग्रिम में कितनी लाइनें हटाएं?


4
आप कैसे जानते हैं कि अंत कहाँ है? यदि आप अंत का वर्णन कर सकते हैं तो आप उस बिंदु को हटा सकते हैं। यदि आप वर्णन कर सकते हैं कि आप moveअंत तक कैसे कर सकते हैं । फिर अंत तक हटना अंत तक जाने से अलग नहीं है।
मार्टिन यॉर्क

@ लोकी, अंत तक बढ़ना आमतौर पर पृष्ठ-डाउन और तीर कुंजी का उपयोग करना है जब तक मैं वहां नहीं पहुंचता। यह हो सकता है पहले या दसवें रिक्त पंक्ति हो, यह हो सकता है पहले बंद करने ब्रेस हो। निचला रेखा है, यह काफी भिन्न होता है।

2
इस उत्तर को भी देखें: stackoverflow.com/a/16407391/164835
Kent

जवाबों:


111

अपने ब्लॉक के शुरुआती लाइन पर जाएं, और टाइप करें ma("ए" (मार्क "ए), हालांकि आप निश्चित रूप से विभिन्न अक्षरों का उपयोग कर सकते हैं , और यहां तक ​​कि विभिन्न अक्षरों के लिए कई अक्षर भी प्रदान किए गए हैं आप इसे सीधे अपने सिर में रख सकते हैं जो प्रत्येक अक्षर का एक निशान है) ।

फिर अंतिम पंक्ति पर जाएं और दर्ज करें d'a("ए" को चिह्नित करने के लिए हटाएं) या y'a("ए" को चिह्नित करने के लिए यांक करें) (ए)

यह वर्तमान से चिह्नित (समावेशी) तक की सभी लाइनों को हटा देगा।

फिर आप इसे सामान्य पेस्ट कमांड के साथ कहीं और पेस्ट कर सकते हैं, जैसे pया P

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


(ए) मैं इसका उपयोग फ़ाइल में अपनी जगह को बचाने के लिए भी करता हूं अगर मुझे किसी चीज़ की तलाश में कहीं और जाना पड़ता है, उदाहरण के लिए, किसी फ़ंक्शन की परिभाषा को कॉपी करना, जिसे मैं कॉल करना चाहता हूं।

मैं बस उसी तरह से वर्तमान लाइन को चिह्नित करता हूं ma, फिर आप जो भी ढूंढ रहे हैं उसे खोजने के लिए भटकते हैं।

फिर, एक बार जब मैंने इसे ढूंढ लिया और इसे एक रजिस्टर में कॉपी कर लिया, तो मैं बस 'a"a", लाइन को पहले से सहेजने के लिए वापस जाने के लिए दर्ज करता हूं, जहां मैं फिर इसे पेस्ट कर सकता हूं।


9
इसके लिए दृश्य विधा का भी उपयोग कर सकते हैं, है ना?
jmc

3
यह एक तरीका है, jmc, लेकिन मुझे यकीन नहीं है कि मानक vi में विज़ुअल मोड है।

5
चूँकि मैं दृश्य चयन से लेकर अंकन और सापेक्ष रेखा संख्या तक एक साल पहले चला गया था, इसलिए मैंने पाया कि vi गति कमांड बहुत तेज़ और कुशल हैं और फिर दृश्य चयन। हालांकि बाद में हर बार आसान होने के बावजूद मैंने vकुंजी को मारा मैं खुद से पूछता हूं कि क्या मुझे वास्तव में इसकी आवश्यकता है या बेहतर गति तरीका है?
सुकिमा

1
हाँ, उसी तरह यह दिलचस्प है, @ सुकिमा, कि मैं एक जीयूआई में भी माउस का उपयोग करने में कम कुशल महसूस करता हूं। अगर मैं कीबोर्ड पर रह सकता हूं तो मैं खुद को तेज पाता हूं।

3
यदि आप कभी भी वास्तव में लंबी लाइनों के साथ कुछ संपादित कर रहे हैं, तो इसका बैकटिक संस्करण बहुत आसान हो सकता है (जो लाइन के भीतर जगह को संदर्भित करता है, बल्कि पूरी लाइन के बजाय)।
सुश्री फूट

65

विम में, दृश्य लाइन मोड का उपयोग करें :

  1. हटाने के लिए अपने कर्सर को टेक्स्ट / कोड के ब्लॉक की शीर्ष रेखा पर रखें
  2. प्रेस V(यह पूंजी "V": Shift+ v) है
  3. हटाने के लिए अपने कर्सर को टेक्स्ट / कोड के ब्लॉक के नीचे ले जाएँ
  4. दबाएँ d

पाठ के बड़े ब्लॉकों को हटाने के लिए यह सरल दृश्य मोड पर पसंद किया जाता है क्योंकि आपको इस बात की चिंता करने की आवश्यकता नहीं है कि कर्सर किस स्तंभ पर है।


3
चरण 3 में। आप ऑब्जेक्ट गतियों का उपयोग करके तेजी से आगे बढ़ सकते हैं। उदाहरण के लिए }पूरे पैराग्राफ या )वाक्यों का चयन करने के लिए उपयोग कर सकते हैं । और भी हैं, आप उनके बारे में पढ़ सकते हैं:h object-motions
mxlian

2
इसके अलावा सबस्ट्रिंग के लिए खोज के साथ /something<CR>अपने चयन ब्लॉक के अंत तक पहुँचने के लिए एक बहुत प्रभावी तरीका है
mxlian

1
यह मेरी पसंदीदा विधि है। हालांकि वैकल्पिक रूप jसे कर्सर को नीचे ले जाने के लिए बार-बार दबाने के लिए (चरण 3), आप उस पंक्ति Gका चयन करने के लिए उसके बाद वाली पंक्ति संख्या टाइप कर सकते हैं । उदाहरण:V150Gd
रणहिरु जूडे कोरे

42

आप कर सकते हैं :set relativenumber, इसलिए आपको गिनने की जरूरत नहीं है। ;)


8
या :set number, और फिर लाइन 35 तक हटाने के लिए d35G का उपयोग करें।
रैंडम 832

2
Ediblemanager के जवाब में सुझाए गए नंबरों की .vim प्लगइन की तरह है relativenumber, लेकिन बेहतर :-)
मार्टिन टूरनोइज

39

आप इसकी संरचना को जानकर टेक्स्ट के बड़े ब्लॉक को आसानी से हटा सकते हैं।

यदि यह पैराग्राफ है, तो उपयोग करें: d{(जैसे आप पैराग्राफ की संख्या के साथ उपसर्ग कर सकते हैं)

यदि यह कोष्ठक के भीतर कोड का ब्लॉक है, तो उपयोग करें: d%

यदि पाठ फ़ाइल के अंत तक दिखाई दे रहा है, तो उपयोग करें: dG

यदि आप जानते हैं कि यह कैसे समाप्त होता है, तो इसका उपयोग करें: d/और इसके बाद आने वाले पाठ टाइप करें Enter(आप नियमित अभिव्यक्ति का उपयोग भी कर सकते हैं, इसलिए संभावनाएं अनंत हैं)।

वैकल्पिक रूप से दृश्य मोड ( V) का उपयोग करें और गति कुंजियों का उपयोग करके पाठ को जल्दी से चुनें (जैसे {) और इसे हटा दें ( d)।

या जैसा कि रेयान ने सुझाव दिया था, d/search-string/eवर्तमान कर्सर से खोजे गए स्ट्रिंग के पाठ को हटाने के लिए उपयोग करें।

देखें: :help dऔर :help motionअधिक जानकारी के लिए।


2
भी है d/search-string/eखोज स्ट्रिंग ही है और सहित खोज स्ट्रिंग के अंत करने के लिए वर्तमान कर्सर से हटाने के लिए c/search-queryहटाए जाने के बाद डालने मोड में मिलता है। के d/साथ उपयोग करना set incsearchएक साफ-सुथरा संयोजन है क्योंकि यह आपको अंतःक्रियात्मक रूप से यह पता लगाने की अनुमति देता है कि क्या आप सही पाठ सीमा पर काम कर रहे हैं, और आपको यह जानने में मदद करनी है कि टाइपिंग से बचने के लिए खोज क्वेरी लिखना बंद करने से अधिक आवश्यक है या नहीं।
रेयान

4
मैं यह भी पता dके साथ a(बाह्य), या i(भीतरी) और एक वस्तु विनिर्देशक बहुत उपयोगी। जैसे वस्तुओं wशब्द के लिए, pपैरा के लिए, (या bके लिए (...), [के लिए [...], {या Bके लिए {...}आदि दृश्य-ऑपरेटरों के लिए प्रलेखन
शाहबाज़

22

आप गतियों और / या पाठ वस्तुओं का उपयोग कर सकते हैं। उदाहरण के लिए, आप कर्सर से अगली रिक्त पंक्ति तक सब कुछ हटा सकते हैं d}। यदि कर्सर पैराग्राफ के अंदर है, तो पैराग्राफ के साथ dipया हटाया जा सकता है dap। यदि कर्सर एक HTML टैग के भीतर है, तो आप इसे ditया के साथ हटा सकते हैं dat

इन के लिए अच्छा mnemonics " d elete i nside" और " d elete a round" (पैराग्राफ / टैग / कोष्ठक) हैं।


11

मैं आमतौर पर करता हूं

:<start>,<end>d

जो प्रदान की गई आरंभ और अंतिम पंक्ति संख्या (दी गई पंक्तियों सहित) के बीच हर पंक्ति को हटा देगा।

ध्यान दें कि दोनों startऔर endकिसी अन्य स्थिति से निरपेक्ष रेखा संख्या, पैटर्न या ऑफसेट हो सकते हैं।

विम के रेंज प्रलेखन को देखने के बारे में डबलडाउन की टिप्पणी को भी देखें , इसमें कुछ उपयोगी सुझाव हैं।

उदाहरण:

कहो कि आपके पास निम्न फ़ाइल है:

1. The quick brown
2. fox jumps
3. over the
4. lazy dog.

फिर आदेश के उपयोग से :2,3dया :/fox/,/over/dया :/quick/+1,/lazy/-1या :+1,+2dअगर आप पहली पंक्ति पर कर रहे हैं या :-1,.dयदि आप तीसरी पंक्ति में हैं, तो आप ऊपर के साथ समाप्त:

1. The quick brown
4. lazy dog.

लेकिन इसका मतलब है कि आपको अभी भी लाइनों की गिनती करने की आवश्यकता है? या मैंने आपके उत्तर को गलत समझा?
मार्टिन टूरनोइज

7
आपको लाइनों की गणना करने की आवश्यकता नहीं है, लेकिन आपको लाइन नंबर जानने की आवश्यकता है।
jmc

पहले करते हैं :set ruler, फिर नंबर खोजने startऔर endलाइन करने के लिए टेक्स्ट के ऊपर और नीचे जाएं , फिर करें:<start>,<end>d
roblogic

1
आप रिश्तेदार लाइन नंबर:+12,+24d
rpattabi

2
वास्तव में, आप इसके लिए <start>और इसके <end>लिए मिश्रित संख्याओं की एक पंक्ति संख्या, पैटर्न की एक जोड़ी या मिश्रित जोड़ी का उपयोग कर सकते हैं । संदर्भ के लिए, देखें :h [range]। इसलिए यह वास्तव में थोड़ा अधिक लचीला है जितना आपने इसे बनाया है।
डबलडाउन

5

यदि यह सीमांकित ब्लॉक है (उदाहरण के लिए: कोड या XML / HTML टैग), जिसके साथ आप काम कर रहे हैं, तो आप ब्लॉक की शुरुआत में कर्सर को रख सकते हैं और दृश्य मोड का उपयोग करने के साथ %जल्दी से कोड के पूरे ब्लॉक का चयन कर सकते हैं और फिर हिट कर सकते हैं। dउन्हें हटाने के लिए।


5
वैकल्पिक रूप से, आप उपयोग कर सकते हैं dap, एक पैराग्राफ को हटाने के लिए da(, da{, da[, कोष्ठक, ब्रेसिज़, या वर्ग कोष्ठक द्वारा delimeted ब्लॉकों को हटाने के लिए। एचटीएमएल के लिए वहाँ है datजो एक टैग को हटा देता है, और, da'और da"तार को हटा दें। वहाँ भी है dip, di(आदि, वेरिएंट, जो सीमांकक के अंदर सब कुछ हटा देगा, लेकिन सीमांकक बरकरार है। वैकल्पिक रूप से, आप सभी (सम्मान आंतरिक) पैराग्राफ का चयन करने के लिए vap(सम्मान vip) का उपयोग कर सकते हैं । (और इसलिए नहीं है va(और vi(।) इसके अलावा वहाँ है capऔर cip(या ca(और ci(हटा सकते हैं और मोड डालने के लिए जाने के लिए) (यानी, "परिवर्तन")। और yapझटका
जे एम सी

मुझे लगता है कि उनके पहले की टिप्पणी में वर्णित कुछ बाइंडिंग @jmc टिम पोप द्वारा चारों ओर से हैं। यह एक महान प्लगइन है जिसे मैं स्थापित करने की सलाह दूंगा, लेकिन इसका मतलब यह है कि ये बाइंडिंग डिफ़ॉल्ट विम इंस्टॉलेशन का हिस्सा नहीं हैं।
हेजिन

5

अन्य सभी अच्छी सलाह के अलावा, मैं वर्तमान कर्सर स्थिति से स्क्रीन पर अंतिम दृश्य रेखा तक सब कुछ हटाने के लिए d+ Shift+ जोड़ रहा हूं L। कमांड को दोहराने से आप अपेक्षाकृत तेजी से नीचे आएंगे।


5

Numbers.vim प्लग इन को इस लिए बहुत उपयोगी है। यह एक पंक्ति संख्या के साथ प्रत्येक पंक्ति को पूर्ववर्ती करने का एक बढ़ा हुआ तरीका है। जैसा 'number'और 'relativenumber', दोनों एक में roled!

यह स्थापना के बाद डिफ़ॉल्ट रूप से सक्षम है, set numberयदि आप इसे पहले से नहीं मिला है, तो आप इसे अपने vimrc में जोड़ना चाहते हैं , क्योंकि यह आपके पास नहीं होने पर अजीब तरीके से व्यवहार करता है।

में सामान्य मोड यह के समान दिखता है :set relativenumber:

  3 call plug#begin('~/.vim/plugged')
  2 
  1 Plug 'myusuf3/numbers.vim'
7   set number█
  1 
  2 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
  3 Plug 'Yggdroot/indentLine'

यह आपको उस पंक्ति के सापेक्ष दिखाता है, जहां कर्सर चालू है, उस रेखा को छोड़कर , जहां वह निरपेक्ष रेखा संख्या (इस मामले में 7) दिखाता है।

यदि हम फिर मोड डालने के लिए स्विच करते हैं, तो यह ऐसा व्यवहार करेगा जैसे कि numberहमेशा पूर्ण रेखा संख्या दिखा कर सेट किया गया था:

  4 call plug#begin('~/.vim/plugged')
  5 
  6 Plug 'myusuf3/numbers.vim'
  7 set number█
  8   
  9 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
 10 Plug 'Yggdroot/indentLine'

कुछ और विकल्प और कुछ कमांड हैं (मुखपृष्ठ की जांच करें), लेकिन चूक अधिकांश लोगों के लिए काम करना चाहिए।


पहले तो मुझे लगा कि यह उत्तर थोड़ा सा विषय था, लेकिन फिर मैंने प्लगइन स्थापित किया और मुझे कहना होगा कि यह मेरे लिए गेम चेंजर है। मैं मैन्युअल रूप से स्वैप करता था और अतिरिक्त मानसिक कदम का मतलब था कि मैं उन गतियों का उपयोग करने से कतराता था। धन्यवाद!
सुकिमा

1
यह कुछ ऐसा लगता है जो एक InsertEnter / InsertLeave autocmd रिश्तेदार लाइन नंबरिंग को टॉगल करने के लिए कर सकता है। क्या मैं कुछ भूल रहा हूँ?
बेन

मुझे पार्टी में बहुत देर हो रही है, लेकिन @ सही है, यह सिर्फ एक युगल ऑटोक्मैंड लाइनें है। उदाहरण के लिए, मेरी vimrc में मेरे पास है set number, set relativenumberतो autocmd InsertEnter * :set norelativenumberऔरautocmd InsertLeave * :set relativenumber
बी परत

4

एक अन्य तरीका यह है कि यदि आप किसी विशिष्ट पैटर्न को हटाने की कोशिश कर रहे हैं, तो आप बस टाइप कर सकते हैं d/delimEnter


2

आप dएक गति में प्रवेश करने की सामान्य प्रक्रिया का उपयोग कर सकते हैं (जैसा कि पहले से ही अन्य उत्तरों में समझाया गया है)। ईज़ीमोशन प्लगइन, नई गति प्रदान करता है जिसका उपयोग आप अपनी समस्या को त्वरित और आसान तरीके से हल कर सकते हैं।

मान लें कि आप वर्तमान कर्सर स्थिति से स्क्रीन पर दिए गए किसी भी शब्द के अंत तक हटाना चाहते हैं, गति कुंजियाँ <Leader><Leader>e(सामान्य eगति के समान ) होंगी । फिर हाइलाइट किए गए अक्षर (अक्षर) टाइप करें जो प्रश्न में शब्द के अंत में दिखाई देते हैं। एक लाइन मोशन भी है, ताकि आप मौजूदा लाइन डाउन टू लाइन को प्रश्न में हटा सकें <Leader><Leader>j

मेरे पास मेरी <Leader>कुंजी है ,। तो, पूरा कमांड d<Leader><Leader>e{हाइलाइटेड लेटर (एस)} है।

से :help easymotion:

EasyMotion, विम में कुछ गतियों का उपयोग करने के लिए बहुत सरल तरीका प्रदान करता है। यह सभी संभावित विकल्पों को उजागर करके w या f से <number>बाहर ले जाता है और आपको सीधे लक्ष्य पर कूदने के लिए एक कुंजी दबाने की अनुमति देता है।<number><number>{char}

जब उपलब्ध गतियों में से एक को ट्रिगर किया जाता है, तो कर्सर के पूर्ववर्ती या पीछा करने वाले सभी दृश्यमान पाठ फीका पड़ जाते हैं, और गति लक्ष्य हाइलाइट किए जाते हैं।

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

EasyMotion के GitHub भंडार पर है https://github.com/Lokaltog/vim-easymotion

सहजता का उपयोग करने वाले लोगों के बारे में यह रेडिट एक मजेदार रीड हो सकता है।


1

एक सरल उपाय है जो आपकी समस्या को हल कर सकता है।

अपने कर्सर को उस टेक्स्ट ब्लॉक की जगह पर रखें, जिसे आप हटाना चाहते हैं, और करें d50gg

यह आपके पाठ की 50 वीं पंक्ति के लिए आपकी वर्तमान स्थिति से सभी पंक्तियों को हटा देगा।

eq: यदि आपका कर्सर 46 रेखा पर है , d50ggतो 4 लाइनें हटा देगा ।


1
मैं सुझाव देता हूं कि Ggg के बजाय इसका उपयोग करना भी vi में काम करता है, और निश्चित रूप से :set numberयह जानने के लिए हमेशा उपयोगी है कि आप जिस लाइन पर जाना चाहते हैं वह किस लाइन की संख्या है।
यादृच्छिक 832

इस सवाल का पूरा मुद्दा यह है कि आप नहीं जानते कि आप कितनी लाइनें निकालना चाहते हैं।
17

200_success, आपको यह जानने की ज़रूरत नहीं है कि आपके द्वारा पोस्ट किए गए उत्तर के साथ आप कितनी लाइनें निकालना चाहते हैं। आपको केवल यह जानना है कि "आप किस लाइन को हटाना चाहते हैं"
गी

1

लाइन हाइलाइटिंग के साथ दृश्य मोड का उपयोग करें।

  1. हटाने के लिए अपने कर्सर को टेक्स्ट / कोड के ब्लॉक की शीर्ष रेखा पर रखें
  2. Shift+ दबाएंv
  3. हटाने के लिए अपने कर्सर को टेक्स्ट / कोड के ब्लॉक के नीचे ले जाएँ
  4. दबाएँ d

मैं कोड के ब्लॉक को हटाने के लिए इस विधि को पसंद करता हूं क्योंकि यह केवल दृश्य मोड का उपयोग करके पूरी लाइनों को हटा देता है जहां आपको सही कॉलम में कर्सर को स्थिति में लाना है जो आप चाहते हैं।


3
आप अनिवार्य रूप से @ 200_success द्वारा उत्तर दोहराते हैं।
मार्टिन श्रोडर

1

मुझे relativenumberहर समय रहना पसंद नहीं है , इसलिए मैंने अपने वीआईएम को केवल तभी सक्षम करने के लिए कॉन्फ़िगर किया जब मैं विज़ुअल मोड में हूं:

" Entering Visual mode
nnoremap <silent>     v :set relativenumber cursorcolumn<CR>v
nnoremap <silent> <C-q> :set relativenumber cursorcolumn<CR><C-q>
nnoremap <silent>    gv :set relativenumber cursorcolumn<CR>gv
nnoremap <silent>     V :set relativenumber<CR>V

" When finished
augroup ClearCursorColumnAndLine
    autocmd!
    autocmd CursorHold * set norelativenumber nocursorcolumn nocursorline
augroup END

इससे आपका काम आसान हो जाता है:

V49jd

क्योंकि मारने के बाद Vआप देख सकते हैं कि लक्ष्य रेखा कितनी दूर है।

यह लंबे समय में कष्टप्रद साबित हो सकता है (जब relativenumber सक्षम / अक्षम होता है तो पाठ दाएं और बाएं हिलता है), लेकिन अभी तक मैं इसे काफी पसंद कर रहा हूं।


1
मुझे लगता है कि आप उपयोग करते हैं v<Esc>d50j?
मार्टिन टूरनोइज

धन्यवाद, मैंने वास्तव में इसे गलत तरीके से लिखा था। वास्तव में मैं इसके साथ शुरू करता Vहूं अगर मुझे पता है कि मैं एक लाइन-वार ऑपरेशन करूंगा, और फिर मैं dअधिक आत्मविश्वास के लिए आखिरी तक छोड़ सकता हूं ।
joeytwiddle

मेरा उत्तर एक गरीब आदमी के नंबरों का अनुमान प्रतीत होता है । किसी अन्य उत्तर में पेश किया गया प्लगइन। ;-)
joeytwiddle

1

मेरे साथ क्या काम किया vi:

  1. :set number लाइन की संख्या देखने के लिए जब तक मैं हटाना नहीं चाहता था;

    +1289 idle 
    +1289 idle 
    +1290 # <- I want to delete until here
    +1291 if [[ ! -z "$SFIN" ]]
    
  2. उस पंक्ति पर वापस जाएं जहां विलोपन शुरू करना था

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