Wie lösche ich eine Zeile über / unter dem Cursor, aber keine aktuelle Zeile?

11

Gibt es einen Befehl zum Löschen von Zeilen (oder n Zeilen) über der aktuellen? Oben = Strom nicht enthalten.

Dh gibt es eine Alternative, bei dkder die aktuelle Zeile nicht gelöscht wird? Ähnlich wie o/ Ound p/ Parbeiten, jedoch mit Löschung.

Momentan kddbewege ich den Cursor eine Zeile nach oben und lösche ihn. Ich könnte nnoremap <Leader>d kddund nnoremap <Leader>D jdd-, aber eine Alternative zu haben, die den Cursor nicht bewegt, scheint eine bessere Option zu sein. Gibt es solche?

Martin Tóth
quelle
Wenn Ihr Problem darin besteht, dass Ihre Zuordnungen den Cursor bewegen, warum tun Sie das nicht nnoremap <Leader>d kddjund nnoremap <Leader>D jddk?
Statox
Wenn Sie entweder kddjoder verwenden jddk, wird die Spaltenposition nicht beibehalten. Ich sage nicht, dass es ein großes Problem ist, aber es ist ärgerlich. Bewegt den kddjCursor für die Aufzeichnung 1 Zeile unter die ursprüngliche Position. Und jdd-scheint eine bessere Alternative zu sein, jddkweil ich zumindest zum ersten Nicht-Leerzeichen zurückkehre. Wenn die Zeile unter der zu löschenden Zeile leer ist, verbleibe ich am Zeilenanfang.
Martin Tóth
Wie wäre es mit makdd`a für Ihre Karte? Setzt eine Markierung und kehrt danach zu ihr zurück. Möglicherweise möchten Sie sie jedoch in ein weniger verwendetes Zeichen ändern.
PhilippFrank
@PhilippFrank Oder ich kann `` verwenden, um den Cursor zurückzubekommen und kein Register zu belegen (nicht, dass ich eines benutze :)).
Martin Tóth
Nein, das funktioniert nicht, k ist kein Sprung, daher können Sie nicht mit `` zurückkehren.
PhilippFrank

Antworten:

30
:-d

schneidet die Linie über der aktuellen Linie.


:-5d

schneidet die 5. Zeile über der aktuellen Zeile (bewegt aber den Cursor).


:-5,-d

schneidet die 5 Zeilen über der aktuellen Zeile.


:+,+5d

schneidet die 5 Zeilen unterhalb der aktuellen Zeile.

romainl
quelle
2
Das bewegt den Cursor trotzdem.
PhilippFrank
1
Sie können es nicht vermeiden, den Cursor zu bewegen. Das Beste, was Sie tun können, ist, den Cursor zu bewegen und ihn zurück zu bewegen .
Romainl
Vielen Dank! Diese Art von "vim way" habe ich gesucht. Ich werde dies in Kombination mit `` verwenden, um den Cursor wieder dorthin zu bringen, wo er war.
Martin Tóth
5

EDIT Ich wusste nicht , die integrierten Funktionen von @Romainl in seiner Antwort vorgeschlagen: natürlich die -dund +dVerfahren bevorzugt werden soll , wie es ist viel einfacher als das Hinzufügen Funktion zu Ihrem.vimrc

Vielleicht .vimrckönnte es das sein, was Sie wollen, wenn Sie so etwas hinzufügen :

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

Diese Funktionen löschen die Zeile unter oder die Zeile über der aktuellen und kehren zur Position vor dem Löschen zurück.

Für die Funktion müssen DeleteOver()wir normal knach dem Löschen eine Zeile nach oben gehen, da durch das Löschen die Nummer der ursprünglichen Zeile geändert wird, mit der nicht zufrieden istDeleteUnder()

Sie können dies auch zu Ihrem hinzufügen .vimrc

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

So erstellen Sie die Zuordnungen, die die Funktionen aufrufen.

statox
quelle
Eine Alternative zum Speichern / Wiederherstellen der Cursorposition besteht darin, die nostartoflineOption zu deaktivieren / wiederherzustellen .
Rich
5

Wenn wir das kleine Löschregister "- verwenden, können wir die Cursorposition nach dem Löschen über n Zeilen wiederherstellen.

Löscht beispielsweise d0dgk"-Püber 1 Zeile und stellt den Cursor wieder her, wo er war.

  1. d0löscht Zeichen vom Cursor zum ersten Zeichen der Zeile. Da 0es sich um eine exklusive Bewegung handelt, wird das Zeichen unter dem Cursor nicht gelöscht. Und die gelöschten Zeichen werden in den kleinen Löschregister "-.

  2. dgklöscht über 1 Zeile. Dadurch wird die aktuelle Zeile verlassen, da sie gknicht zeilenweise und exklusiv ist.

  3. "-P setzt den Text aus dem kleinen Löschregister "-.

Es ist eine Art Hack. Wenn Sie jedoch nach Nicht-Ex-Befehlen suchen, sollten Sie diese verwenden.

MS.Kim
quelle
Schöne Lösung! Obwohl ich denke du willst "-Pnicht "-p. Letzteres bringt den Text ein wenig durcheinander.
James
@ DJMcMayhem Du hast recht. Ich habe die Antwort korrigiert. Vielen Dank für den Hinweis.
MS.Kim
2

Vielleicht verbessern Sie Ihren Workflow, wenn Sie keine Angst haben ... zu springen :)

Beispiel:

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.

Ihre Aktionen (normaler Modus, Cursor ist eingeschaltet _) : /I want Enter 5dd Ctrl-o. Das ist es.

Natürlich ist die Antwort von romainl die beste, wenn Sie nur ganze Zeilen löschen möchten, und Sie können deren Versatz leicht zählen (z. B. mit relativen Leinenzahlen). Das Obige ist eine allgemeinere Art zu "handeln": Gehen Sie dorthin und verwenden Sie etwas, das als Sprung zählt: Dies bedeutet, dass Sie jederzeit zurückspringen können, nachdem Sie den Text geändert haben.

Wenn Sie beispielsweise absolute Zeilennummern verwenden, können Sie diese durch /I want Enteretwas ersetzen 78ggoder 78Gdirekt auf diese Zeilennummer springen.

VanLaser
quelle
0

Basierend auf der ms-kim- Lösung habe ich eine etwas andere Variante entwickelt, die die Kolonation spart.

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: Ich habe diesen Beitrag auch als Referenz verwendet.

SergioAraujo
quelle
Meinen Sie eher @statox als @ MS.Kim?
Rich
-1

Wenn Sie doppelte Zeilen in der gesamten Datei löschen möchten, gehen Sie einfach wie folgt vor:

:g/any part of the string/d

Beispiel:

Im Befehlsmodus

:g/I want to delete/d

Wenn Sie zunächst nur eine Liste der Zeichenfolgen wünschen:

:g/I want to delete/p
user11509
quelle
3
Ich bin mir nicht sicher, wie dies die gestellte Frage beantwortet.
Martin Tournoij