Come eliminare la riga sopra / sotto il cursore, ma non la riga corrente?


11

Esiste un comando per eliminare la riga (o n righe) sopra quella corrente? Sopra = corrente non inclusa.

Vale a dire, c'è un'alternativa a dkcui non elimina la riga corrente? Simile a come o/ Oe p/ Pfunziona, ma con la cancellazione.

Attualmente, lo sto facendo kdd, che sposta il cursore di una riga verso l'alto e lo elimina. Potrei farlo nnoremap <Leader>d kdde nnoremap <Leader>D jdd-, ma avere un'alternativa che non sposta il cursore sembra un'opzione migliore. C'è questo?


Se il tuo problema è che i tuoi mapping spostano il cursore perché non lo fai nnoremap <Leader>d kddje nnoremap <Leader>D jddk?
statox

Usando kddjo jddk, la posizione della colonna non viene mantenuta. Non sto dicendo che è un grosso problema, ma è fastidioso. Per la registrazione, kddjsposta il cursore di 1 riga sotto la posizione originale. E jdd-sembra un'alternativa migliore jddkperché almeno sto tornando al primo personaggio non spaziale. Se la riga sotto quella che voglio eliminare è vuota, rimango all'inizio della riga.
Martin Tóth,

Che ne dici di usare makdd`a per la tua mappa? Imposta un segno e torna ad esso in seguito ... potresti però volerlo cambiare in un personaggio meno usato.
PhilippFrank

@PhilippFrank Oppure posso usare `` per riavere il cursore e non occupare un registro (non che io usi nessuno :)).
Martin Tóth,

No che non funziona, k non è un salto, quindi non puoi tornare indietro usando ``.
PhilippFrank,

Risposte:


30
:-d

taglia la linea sopra la linea corrente.


:-5d

taglia la quinta riga sopra la riga corrente (ma sposta il cursore).


:-5,-d

taglia le 5 linee sopra la linea corrente.


:+,+5d

taglia le 5 righe sotto la riga corrente.


2
Ciò sposta comunque il cursore.
PhilippFrank,

1
Non puoi evitare di spostare il cursore. Il meglio che puoi fare è spostare il cursore e spostarlo indietro .
romainl,

Grazie! Questo tipo di "vim way" è quello che stavo cercando. Lo userò in combinazione con `` per riportare il cursore dov'era.
Martin Tóth,

5

EDIT Non conoscevo le funzionalità integrate suggerite da @Romainl nella sua risposta: ovviamente il metodo -de +ddovrebbe essere preferito in quanto è molto più semplice dell'aggiunta di funzioni al tuo.vimrc

Forse aggiungere qualcosa del genere al tuo .vimrcpotrebbe essere quello che vuoi:

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

Queste funzioni eliminano la linea sotto o la linea sopra quella corrente e tornano alla posizione prima della cancellazione.

Per la funzione DeleteOver()è necessario salire di una riga normal kdopo l'eliminazione poiché l'eliminazione modifica il numero della riga originale che non si verifica conDeleteUnder()

Puoi anche aggiungere questo al tuo .vimrc

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

Per creare i mapping chiamando le funzioni.


Un'alternativa al salvataggio / ripristino della posizione del cursore consiste nel disinserire / ripristinare l' nostartoflineopzione.
Rich

5

Se utilizziamo il piccolo registro di cancellazione "-, possiamo ripristinare la posizione del cursore dopo aver eliminato sopra n righe.

Ad esempio, d0dgk"-Pelimina sopra 1 riga e ripristina il cursore indietro.

  1. d0elimina i caratteri dal cursore al primo carattere della riga. Poiché 0è un movimento esclusivo, il carattere sotto il cursore non viene eliminato. E i caratteri eliminati vengono inseriti nel piccolo regsiter di eliminazione "-.

  2. dgkcancella sopra 1 riga. Questo lascerà la riga corrente, perché gknon è lineare ed esclusiva.

  3. "-P mette il testo dal piccolo registro di cancellazione "-.

È una sorta di hack. Ma se stai cercando comandi non ex, considera di usarlo.


Bella soluzione! Anche se penso che tu "-Pnon voglia "-p. Quest'ultimo incasina un po 'il testo.
James,

@DJMcMayhem Hai ragione. Ho corretto la risposta. Grazie per averlo sottolineato.
MS.Kim

2

Forse migliorerai il tuo flusso di lavoro se non hai paura di ... saltare :)

Esempio:

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.

Le vostre azioni (modalità normale, il cursore si trova su _): /I want Enter 5dd Ctrl-o. Questo è tutto.

Ovviamente, la risposta di Romainl è la migliore se si desidera eliminare intere righe e si può contare facilmente il loro offset (utilizzando ad esempio i relativi numeri di biancheria). Quanto sopra è un modo più generico di "agire": vai lì, usando qualcosa che conta come un salto: questo significa che puoi sempre tornare indietro, dopo aver modificato il testo.

Ad esempio, se usi numeri di riga assoluti, puoi sostituirli /I want Entercon qualcosa di simile 78ggo 78Gsaltare direttamente a quel numero di riga.


0

Sulla base della soluzione ms-kim ho sviluppato una variazione leggermente diversa che consente di risparmiare la posizione.

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: ho anche usato questo post come riferimento.


Intendi @statox anziché @ MS.Kim?
Rich

-1

Se si desidera eliminare righe duplicate in tutto il file, attenersi alla seguente procedura:

:g/any part of the string/d

Esempio:

In modalità comando

:g/I want to delete/d

Se vuoi solo un elenco delle stringhe inizialmente:

:g/I want to delete/p

3
Non sono davvero sicuro di come questo risponda alla domanda posta?
Martin Tournoij,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.