कर्सर के ऊपर / नीचे लाइन कैसे हटाएं, लेकिन वर्तमान लाइन नहीं?


11

क्या मौजूदा एक से ऊपर लाइन (या एन लाइन) हटाने के लिए कोई कमांड है? ऊपर = वर्तमान शामिल नहीं है।

यानी, क्या कोई विकल्प है dkजो वर्तमान लाइन को नष्ट नहीं करता है? कैसे o/ Oऔर p/ Pकाम करने के लिए समान है , लेकिन विलोपन के साथ।

वर्तमान में, मैं कर रहा हूँ kdd, जो कर्सर को एक पंक्ति ऊपर ले जाता है और उसे हटा देता है। मैं कर सकता था nnoremap <Leader>d kddऔर है nnoremap <Leader>D jdd-, लेकिन एक विकल्प है जो कर्सर को स्थानांतरित नहीं करता है एक बेहतर विकल्प की तरह लगता है। क्या ऐसा है?


यदि आपकी समस्या यह है कि आपके मैपिंग कर्सर को स्थानांतरित करते हैं तो आप क्यों नहीं करते हैं nnoremap <Leader>d kddjऔर nnoremap <Leader>D jddk?
statox

kddjया तो या jddk, स्तंभ स्थिति का उपयोग संरक्षित नहीं है। मैं यह नहीं कह रहा कि यह एक बड़ी समस्या है, लेकिन यह कष्टप्रद है। रिकॉर्ड के लिए, kddjमूल स्थिति के नीचे कर्सर 1 लाइन चलता है। और jdd-एक बेहतर विकल्प की तरह लगता है jddkक्योंकि कम से कम मैं पहले गैर सफेद अंतरिक्ष चरित्र में लौट रहा हूं। यदि मैं जिस लाइन को हटाना चाहता हूं, उसके नीचे की रेखा खाली है, मैं लाइन की शुरुआत में छोड़ दिया गया हूं।
मार्टिन तोथ

कैसे अपने नक्शे के लिए makdd`a का उपयोग करने के बारे में? एक निशान सेट करता है और इसके बाद वापस लौटता है ... आप इसे कम इस्तेमाल किए गए चरित्र में बदलना चाहते हैं।
फिलिपफ्रैंक

@PhilippFrank या मैं कर्सर को वापस लाने के लिए `` का उपयोग कर सकता हूं और रजिस्टर पर कब्जा नहीं कर सकता (ऐसा नहीं कि मैं किसी का उपयोग करता हूं :))।
मार्टिन टोह

नहीं, जो काम नहीं करता है, k एक कूद नहीं है, इसलिए आप `` का उपयोग करके वापस नहीं जा सकते।
फिलिप्रेंक

जवाबों:


30
:-d

वर्तमान लाइन के ऊपर की रेखा को काटता है।


:-5d

वर्तमान लाइन के ऊपर 5 वीं पंक्ति को काटता है (लेकिन कर्सर ले जाता है)।


:-5,-d

वर्तमान लाइन के ऊपर 5 लाइनों को काटता है।


:+,+5d

वर्तमान लाइन के नीचे 5 लाइनों को काटता है।


2
हालांकि वह अभी भी कर्सर ले जाता है।
फिलिपफ्रैंक

1
आप कर्सर ले जाने से बच नहीं सकते। सबसे अच्छा आप कर सकते हैं कर्सर को स्थानांतरित करें और इसे वापस ले जाएं
रोमेनल

धन्यवाद! इस तरह का "वीम तरीका" वही है जिसकी मुझे तलाश थी। मैं कर्सर को वापस लाने के लिए `` के संयोजन में इसका उपयोग करने जा रहा हूं जहां यह था।
मार्टिन टोह

6

यदि हम छोटे डिलीट रजिस्टर का उपयोग करते हैं "-, हम n लाइनों के ऊपर हटाने के बाद कर्सर की स्थिति को बहाल कर सकते हैं।

उदाहरण के लिए, d0dgk"-P1 पंक्ति से ऊपर हटाता है और कर्सर को वापस उसी स्थान पर पुनर्स्थापित करता है जहां यह था।

  1. d0कर्सर को पंक्ति के पहले वर्ण से हटाता है। चूंकि 0एक विशेष गति है, इसलिए कर्सर के नीचे का वर्ण हटाया नहीं जाता है। और हटाए गए वर्ण छोटे हटाए गए regsiter में डाल दिए जाते हैं "-।

  2. dgk1 पंक्ति से ऊपर हटाता है। यह वर्तमान रेखा को छोड़ देगा, क्योंकि gkयह अलंकृत और अनन्य नहीं है।

  3. "-P पाठ को छोटे डिलीट रजिस्टर से डालता है "-।

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


अच्छा समाधान! हालांकि मुझे लगता है कि आप "-Pनहीं चाहते हैं "-p। उत्तरार्द्ध पाठ को थोड़ा गड़बड़ कर देता है।
जेम्स

@DJMcMayhem तुम सही हो। मैंने जवाब सही दिया। इसे इंगित करने के लिए धन्यवाद।
MS.Kim

5

EDIT मैं अपने जवाब में @Romainl द्वारा सुझाई गई अंतर्निहित विशेषताओं को नहीं जानता था: बेशक -dऔर +dविधि को पसंद किया जाना चाहिए क्योंकि यह आपके कार्यों में जोड़ने की तुलना में सरल है.vimrc

हो .vimrcसकता है कि आपके साथ ऐसा कुछ हो जो आप चाहते हैं:

function! DeleteOver()
   let save_cursor = getpos(".")
   normal k
   normal dd
   call setpos(".", save_cursor)
   normal k
endfunction

function! DeleteUnder()
   let save_cursor = getpos(".")
   normal j
   normal dd
   call setpos(".", save_cursor)
endfunction

ये फ़ंक्शंस लाइन के नीचे या मौजूदा लाइन को हटाते हैं और डिलीट होने से पहले वापस स्थिति में आ जाते हैं।

फ़ंक्शन के लिए DeleteOver()हमें normal kविलोपन के बाद एक पंक्ति के साथ ऊपर जाने की आवश्यकता है क्योंकि विलोपन मूल रेखा की संख्या को बदल देता है जिसके साथ खुशी नहीं होती हैDeleteUnder()

आप इसे अपने लिए भी जोड़ सकते हैं .vimrc

nnoremap <Leader>d :call DeleteOver()<CR>
nnoremap <Leader>D :call DeleteUnder()<CR>

फ़ंक्शन को कॉल करने वाले मैपिंग बनाने के लिए।


कर्सर स्थिति को बचाने / बहाल करने का एक विकल्प विकल्प को परेशान / पुनर्स्थापित करना nostartoflineहै।
रिच

2

शायद आप अपने वर्कफ़्लो में सुधार करेंगे अगर डर नहीं है ... कूद :)

उदाहरण:

This is where cursor initially is: _.

[Some other stuff you want to keep/skip ...]

I want to delete these lines.
I want to delete these lines.
I want to delete these lines.
I want to delete these lines.
I want to delete these lines.

आपके कार्य (सामान्य मोड, कर्सर चालू है _) /I want Enter 5dd Ctrl-o:। बस।

बेशक, रोमेल का उत्तर सबसे अच्छा है यदि आप सभी पूरी लाइनों को हटाना चाहते हैं, और आप आसानी से उनके ऑफसेट की गणना कर सकते हैं (उदाहरण के लिए रिश्तेदार लिनेनटर्स का उपयोग करके)। उपरोक्त "एक्ट" करने के लिए एक अधिक सामान्य तरीका है: वहां जाएं, एक ऐसी चीज का उपयोग करें जो एक छलांग के रूप में गिना जाता है: इसका मतलब है कि आप पाठ को संशोधित करने के बाद हमेशा वापस कूद सकते हैं।

उदाहरण के लिए, यदि आप निरपेक्ष रेखा संख्याओं का उपयोग करते हैं, तो आप उस पंक्ति संख्या पर सीधे /I want Enterकिसी चीज़ की जगह ले सकते हैं 78ggया 78Gकूद सकते हैं।


0

Ms-kim समाधान के आधार पर मैंने थोड़ा भिन्न भिन्नता विकसित की है जो कोल पोस्ट को बचाता है।

function! DeleteLineAbove()
    if line('.') == 1
        echom "You are at the first line!"
        return
    endif
    let l:colsave = col(".")
    exec  "normal! kdd"
    call cursor(line("."), l:colsave)
endfunction
nnoremap <Leader>k :call DeleteLineAbove()<CR>

OBS: मैंने इस पोस्ट को संदर्भ के रूप में भी इस्तेमाल किया है ।


क्या आपका मतलब @ MS.Kim के बजाय @statox से है?
रिच

-1

यदि आप पूरी फ़ाइल में डुप्लिकेट लाइनें हटाना चाहते हैं, तो बस निम्नलिखित कार्य करें:

:g/any part of the string/d

उदाहरण:

कमांड मोड में

:g/I want to delete/d

यदि आप शुरू में स्ट्रिंग की सूची चाहते हैं:

:g/I want to delete/p

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