2010-09-02 8 views
50

क्या कोई लाइन (या कई लाइनें) को हटाने के लिए कोई आदेश है जो तुरंत वर्तमान लाइन से नीचे है? वर्तमान में मैं इसे इस प्रकार कर रहा हूं: जेडीडी और फिर । आवश्यकतानुसार दोहराने के लिए। क्या कोई ऐसा आदेश है जो इन सभी को जोड़ देगा?विम में वर्तमान लाइन के नीचे लाइन (ओं) को कैसे हटाएं?

अद्यतन: कारण मैं इस तरह का आदेश रखना चाहता हूं कि मैं वर्तमान स्थिति से दूर नहीं जाना चाहता, फिर भी नीचे पंक्तियों को हटाने में सक्षम हूं।

+0

मुझे लगता है कि @ पीटर रिंकर का जवाब उत्तर – gixxer

+0

@gixxer के रूप में चिह्नित किया जाना चाहिए, – Valentin

उत्तर

115

हटाएं पूर्व कमांड अच्छी तरह से काम करेगा।

:+,$d 

यह अंत ($) तक वर्तमान +1 से सभी लाइनों को नष्ट करेगा

अगले 2 लाइनों को हटाने के लिए अनुवर्ती रेंज काम करेगा, +1,+2 या आशुलिपि +,+2

:+,+2d 

जैसा कि @ib ने :delete या :d आदेश का उल्लेख कर्सर को हटाए गए टेक्स्ट के बगल में लाइन की शुरुआत में ले जाया जाएगा। (यहां तक ​​कि nostartofline सेट के साथ)। इसे दूर करने के लिए हम `` सामान्य मोड कमांड जारी कर सकते हैं। `` अंतिम कूद से पहले सटीक स्थिति पर वापस कूद जाएगा, इस मामले में :d कमांड। हमारे आदेश अब

है:+,+``

या प्रवेश एक पूर्व आदेश के रूप में

+०१२३५१६४१०६

command! -count=1 -register D :+,+<count>d <reg><bar>norm! `` 

अब अगले निम्नलिखित 3 लाइनों को हटाने के लिए:

:+,+2d|norm! `` 

इस आसान हम यह सब एक आदेश में लपेट बनाने के

:3D 

यह आदेश भी एक {reg}:delete की तरह ले जा सकते हैं और :yank करो। तो रजिस्टर a में अगले 4 लाइनों को हटाने होगा:

:4D a 

अधिक जानकारी

:h :d 
:h :command 
:h :command-register 
:h :command-count 
:h `` 
+3

ध्यान दें कि यह एक काफी आसान समाधान है जो "बॉक्स से बाहर" काम करता है और अन्य आदेशों के लिए सामान्यीकृत है (उदाहरण के लिए, ': + 1, + 5s! ए! बी! जी' बी के साथ 4 लाइनों पर प्रतिस्थापित करेगा कर्सर के बाद)। देखें: कुछ और उदाहरणों के लिए कमांड-श्रेणियों में मदद करें। –

+0

यह सरल समाधान बहुत अच्छा होगा, अगर केवल कर्सर को स्थानांतरित नहीं करता है। कम से कम, आदेश ': +, $ d | norm! \ '\' 'जैसा दिखना चाहिए। वैसे, जैसा कि सवाल में बताया गया है, प्रश्न के लेखक वर्तमान के नीचे कई लाइनों को हटाना चाहते हैं, जरूरी नहीं कि फाइल के अंत तक सभी तरह से नीचे जाएं। –

+0

@ib: क्या उत्तर श्रेणी के अधिक विस्तृत स्पष्टीकरण द्वारा उत्तर में सुधार किया जाएगा? शायद 'सोल सेट'? '\' 'चिह्न का उपयोग कैसे करें? –

0

आप एक छोटे से समारोह है कि आप वास्तव में क्या वर्णित करता है परिभाषित कर सकते हैं: वर्तमान रेखा से नीचे अगले n पंक्तियों को हटा दें और प्रारंभिक कर्सर की स्थिति बहाल।

function! DeleteNextLines(n, reg) 
    let l = line('.') 
    let m = min([a:n, line('$')-l]) 
    if m > 0 
     let c = col('.') 
     exe '+,+'.m 'd' a:reg 
     call cursor(l, c) 
    endif 
endfunction 

इसके अलावा, आप एक आदेश है कि (, एक डिफ़ॉल्ट रूप से) नीचे नष्ट करने के लिए लाइनों की गिनती को स्वीकार करता है और एक वैकल्पिक तर्क (बस के रूप में :delete आदेश) के रूप में उपयोग करने के लिए रजिस्टर नाम निर्धारित कर सकते हैं।

:command! -range=1 -register -bar D call DeleteNextLines(<count>, <q-reg>) 

इसके अतिरिक्त आप, :D चलाने के लिए एक मानचित्रण निर्धारित कर सकते हैं अगर यह आवश्यक है।

+0

के सिर के लिए धन्यवाद, इसका परीक्षण नहीं किया गया है, लेकिन उत्तर के रूप में स्वीकार करें। – Valentin

+0

उदाहरण के लिए, कॉमा को मानचित्र करने के लिए, डी (प्रेस ',' के बाद डी) निम्नलिखित पंक्तियां डालें (उपरोक्त उत्तर @ib द्वारा दर्ज करने के बाद) 1: 'mapleader = "," ' 2:' nmap डी: डी ' –

2

आपने हटाने के लिए लाइनों की संख्या में प्रवेश कर सकता: जे कश्मीर

+0

अंतिम' k' कर्सर को प्रारंभिक रेखा से ऊपर ले जाता है। साथ ही, 'dd' के कारण कर्सर कॉलम स्थिति खो जाएगी। –

+0

@ib: मेरे परीक्षणों में यह नहीं है। क्या आपने वास्तव में कोशिश की है? प्रारंभिक ** जे ** नोट करें। –

+0

मुझे खेद है, मेरा पहला बिंदु गलत था (जब मैंने कमांड का प्रयास किया है, मैंने नहीं देखा है कि मैंने जो गिनती निर्दिष्ट की है ('20', आपके उदाहरण में) लाइनों की संख्या से अधिक थी बफर)। लेकिन दूसरा एक बना रहता है: कर्सर की कॉलम स्थिति 'dd' के बाद बदल जाती है (हटाए गए लाइनों के बगल में रेखा के पहले गैर-खाली वर्ण में, मुझे विश्वास है)। –

25

यह वर्तमान एक नीचे सभी लाइनों को नष्ट करेगा:

jdG 

दुर्भाग्य है कि के बाद हटा किया जाता है वर्तमान पंक्ति के आरम्भ में कर्सर ले जाने के होगा।

+2

और बफर के अंत तक भी हर पंक्ति को हटा देगा। –

+0

मैं मूल प्रश्न को गलत तरीके से पढ़ता हूं, क्षमा करें। सोचा कि ओपी वर्तमान के नीचे सभी लाइनों को हटाना चाहता है। मेरी पोस्ट बदल दी – ClosedID

+0

स्वीकार्य उत्तर होना चाहिए! –

3

यह अंक के लिए एक नौकरी है!

प्रयास करें maj20dd`a

ma फ़ाइल-विशिष्ट चिह्न सेट 'एक', j20dd विलोपन आप चाहते हैं (इस मामले में 20 लाइनों) करता है, और `a निशान की स्थिति (पंक्ति और स्तंभ) को आप पुनर्स्थापित करता है।

स्पष्ट रूप से इस पैटर्न को चिह्न पर लौटने से पहले जो कुछ भी आप चाहते हैं उसे करने के लिए बढ़ाया जा सकता है। यदि आप mA (या कोई अन्य पूंजी अक्षर) का उपयोग करते हैं तो यह चिह्न वास्तव में फ़ाइलों में अद्वितीय होगा, ताकि आप लौटने से पहले कहीं और संपादित कर सकें। यदि आपके पास लगातार उपयोग होता है तो आप इसे ऊपर बताए गए मैक्रो बना सकते हैं।

5

अन्य समाधान जानकारीपूर्ण रहे हैं, लेकिन मुझे लगता है यह इस बात के लिए मैक्रो का उपयोग करने के लिए आसान हो जाएगा के लिए:

qq (शुरू होता है रिकॉर्डिंग)

jddk (, नीचे जाना लाइन हटाने के लिए, और ऊपर वापस जाओ - वें यानी ing आपको बस इतना करना)

q (अंत रिकॉर्डिंग)

अब आप @q क्या कर सकते हैं इस क्रिया को करने, वर्तमान स्थिति में कर्सर को बनाए रखने चाहते हैं। आप कर्सर के नीचे 5 लाइनों को हटाने के लिए [email protected] जैसे कुछ भी कर सकते हैं।

और अंत में, आप कार्रवाई एक बार से अधिक दोहरा रहे हैं, तो आप सिर्फ @@ पहली बार जब आप @q (यह पिछली बार उपयोग करने मैक्रो को दोहराता है - इस मामले q में) चलाने के बाद टाइप कर सकते हैं

6

अच्छी तरह से, करने के लिए यह बस आप xxdd कमांड का उपयोग कर सकते हैं। अधिकांश समय मुझे पता है (कम से कम एक विचार है) स्क्रिप्ट का आकार जिसे मैं संपादित कर रहा हूं। तो, आदेश के रूप में नीचे आमतौर पर पर्याप्त से अधिक है:

  • 99dd
  • 999dd कर्सर की स्थिति से शुरू 999lines दूर करने के लिए।
  • 9999dd
  • बहुत लंबे स्क्रिप्ट के लिए 99999dd;)
48

"महानिदेशक" काम करना चाहिए। इसका मतलब है वर्तमान कर्सर से फ़ाइल के अंत तक सभी पंक्तियां हटाएं।

+0

यह सही उत्तर है। – Gaurav

संबंधित मुद्दे