Gibt es einen Befehl zum Löschen einer Zeile (oder mehrerer Zeilen), die unmittelbar unter der aktuellen Zeile liegt? Momentan mache ich es als: jddund dann .nach Bedarf zu wiederholen. Gibt es einen Befehl, der all dies kombiniert?
UPDATE: Der Grund, warum ich einen solchen Befehl haben möchte, ist, dass ich mich nicht von der aktuellen Position entfernen möchte, aber in der Lage bin, die folgenden Zeilen zu löschen.
Antworten:
Der Befehl delete ex funktioniert gut.
Dadurch werden alle Zeilen von aktuell +1 bis zum Ende gelöscht ($)
Um die nächsten 2 Zeilen zu löschen, würde der folgende Bereich funktionieren,
+1,+2
oder Kurzform+,+2
Wie @ib erwähnt, bewegt der Befehl
:delete
oder:d
den Cursor an den Anfang der Zeile neben dem gelöschten Text. (Auch mitnostartofline
Set). Um dies zu überwinden, können wir den``
Befehl normal mode ausgeben .``
springt vor dem letzten Sprung an die genaue Position zurück, in diesem Fall den:d
Befehl. Unser Befehl ist jetzt:+,+2denter``
Oder als ein Ex-Befehl
Um dies zu vereinfachen, fassen wir dies alles in einem Befehl zusammen:
Löschen Sie nun die nächsten 3 Zeilen:
Dieser Befehl kann auch einen
{reg}
wie:delete
und:yank
tun. Das Löschen der nächsten 4 Zeilen in das Registera
wäre also:Für mehr Informationen
quelle
:+1,+5s!a!b!g
wird a in den 4 Zeilen nach dem Cursor durch b ersetzt). Weitere Beispiele finden Sie unter: Hilfebefehlsbereiche.:+,$d|norm!``
. Übrigens, wie in der Frage angegeben, möchte der Autor der Frage mehrere Zeilen unterhalb der aktuellen löschen, nicht unbedingt bis zum Ende der Datei.set sol
? Wie benutzt man die`
Marke?sol
Ausschalten allein löst das Problem übrigens nicht: Wenn man beispielsweise drei Zeilen mit löscht,:+,+3d
wird der Cursor auf die Zeile neben den gelöschten verschoben.dGsollte arbeiten.
Dies bedeutet, dass alle Zeilen bis zum Ende der Datei vom aktuellen Cursor gelöscht werden.
quelle
Dadurch werden ALLE Zeilen unter der aktuellen gelöscht:
Leider bewegt sich der Cursor nach dem Löschen an den Anfang der aktuellen Zeile.
quelle
Nun, um es einfach zu machen, könnten Sie den Befehl xxdd verwenden. Die meiste Zeit kenne ich (zumindest habe ich eine Idee) die Größe des Skripts, das ich bearbeite. Der folgende Befehl ist normalerweise mehr als genug:
quelle
Die anderen Lösungen sind informativ, aber ich denke, es wäre einfacher, ein Makro dafür zu verwenden:
qq
(beginnt mit der Aufnahme)jddk
(Gehen Sie nach unten, löschen Sie die Zeile und gehen Sie wieder nach oben - dh das, was Sie tun möchten.)q
(Aufnahme beenden)Jetzt können Sie
@q
diese Aktion ausführen und den Cursor an der aktuellen Position halten. Sie können auch5@q
5 Zeilen unter dem Cursor löschen.Und schließlich, wenn Sie die Aktion mehr als einmal wiederholen, können Sie sie einfach
@@
nach der ersten Ausführung@q
eingeben (dies wiederholt das zuletzt verwendete Makro - in diesem Fallq
).quelle
Dies ist ein Job für Noten!
Versuchen
maj20dd`a
ma
Setzt die dateispezifische Marke 'a',j20dd
führt den gewünschten Löschvorgang durch (in diesem Fall 20 Zeilen) und`a
stellt die Position der Marke (Zeile und Spalte) wieder her.Natürlich kann dieses Muster erweitert werden, um alles zu tun, was Sie wollen, bevor Sie zur Marke zurückkehren. Wenn Sie
mA
(oder einen anderen Großbuchstaben) verwenden, ist die Marke tatsächlich für alle Dateien eindeutig, sodass Sie sie vor der Rückkehr sogar an anderer Stelle bearbeiten können. Wenn Sie eine sehr häufige Verwendung haben, können Sie es wie oben vorgeschlagen zu einem Makro machen.quelle
Sie können die Anzahl der zu löschenden Zeilen eingeben : j 20 dd k.
quelle
k
bewegt den Cursor über die Anfangszeile. Außerdem geht die Position der Cursorspalte aufgrund von verlorendd
.dd
(auf das erste nicht leere Zeichen der Zeile neben den gelöschten Zeilen, glaube ich).Nur zum Spaß können Sie eine kleine Funktion definieren, die genau das tut, was Sie beschrieben haben: Löscht die nächsten
n
Zeilen unter der aktuellen Zeile und stellt die ursprüngliche Cursorposition wieder her.Sie können auch einen Befehl definieren, der die Anzahl der zu löschenden Zeilen (eine, falls nicht angegeben) und den Registernamen akzeptiert, der als optionales Argument verwendet werden soll (genau wie der
:delete
Befehl).Darüber hinaus können Sie bei Bedarf eine Zuordnung zum Auslösen des obigen
:D
Befehls definieren .quelle
let mapleader = ","
2:nmap <leader>d :D<CR>