Wie lösche ich Inhalte rückwärts bis "=" in der vorherigen Zeile?

9

Ich verwende ein Beispiel für Javascript-Code:

1        var a = 1;
2        var b = |{};

Der Cursor befindet sich an der Position von |(auf dem Zeichen "{", wenn die Cursorform blockiert ist). Ich finde heraus, dass mir aein Objekt zugewiesen werden soll, also möchte ich es wie folgt ändern:

1        var a = {};

Ich möchte also wissen, wann der Cursor auf "{" steht, wie schnell alle Inhalte vor "{" bis zum Leerzeichen nach dem "=" -Zeichen in Zeile 1 gelöscht werden können.

In anderen normalen Editoren drücke ich einfach die Rücktaste, um den Code zu löschen. Aber ich weiß nicht, wie ich das in vim erreichen soll.

Aaron Shen
quelle
Sie können auch idie Rücktaste drücken und verwenden. Kein Körper wird dich dafür erschießen. Meiner Ansicht nach.
Elyashiv
1
aber die
Aaron Shen
3
@AaronShen Das hängt von Ihrer 'Rücktaste' ab. Wenn dies der eolFall ist, werden durch Zeilenumbrüche Zeilenumbrüche gelöscht. Sie müssen startauch in die Einstellung einbezogen werden. (Siehe :help backspace). Verwenden Sie diese Methode jedoch nicht! In den folgenden Antworten werden einige viel schnellere Methoden beschrieben.
Rich

Antworten:

20

Nicht sicher , ob ich verstehe völlig die Frage, aber wenn man wollte löschen , bis Sie nur haben var a = {};, Sie könnten, von der Cursorposition, Verwendungd?1Enter

dnimmt eine Bewegung an, und Sie können ihr ein Suchmuster /für eine Vorwärtssuche oder ?eine Rückwärtssuche geben.

Hier ist ein kleines GIF, das dies demonstriert:

Geben Sie hier die Bildbeschreibung ein

Akshay
quelle
1
Es ist wahrscheinlich erwähnenswert, dass Sie Enternach dem Tippen drücken müssen d?1.
Rich
@ Rich in der Tat danke, ich habe die Antwort aktualisiert, um das aufzunehmen.
Akshay
1
Welche Schriftart verwendet diese Shell?
Chris Burt-Brown
@ ChrisBurt-Brown: Terminus
Akshay
10

Wenn Sie vim (und nicht classic vi) verwenden, können Sie dies in Ihrem Beispiel tun vkd(oder vkx).

  • v versetzt es in den 'visuellen' (Auswahl-) Modus
  • k wird eine Zeile nach oben gehen, um den Cursor auf die '1' zu setzen und den Teil auszuwählen, den Sie löschen möchten
  • doder xlöscht die Auswahl
BobH
quelle
5

Löschen

In diesem speziellen Beispiel dgkist dies eine der schnellsten Möglichkeiten.

Dem dBefehl kann, wie Akshay erklärte , eine Bewegung folgen, bei der alle Zeichen zwischen dem Beginn des Cursors und dem Ort, an den die Bewegung ihn führt, gelöscht werden.

In Ihrem Code möchten Sie alles zwischen der Cursorposition und derselben Spalte eine Zeile weiter oben löschen. gkWenn Sie also den Cursor mit der Bewegung nach oben bewegen (was bei Verwendung mit einem Operator nicht linienweise erfolgt), wird Ihr Ziel erreicht.

BEARBEITEN : BobH weist in den Kommentaren darauf hin, dass diese Methode nur funktioniert, wenn sie 'wrap'eingestellt ist. Wenn Sie nicht immer ein Wrap-Set haben, ist es wahrscheinlich besser , wenn Sie dvkoder verwenden vkd, wie in den anderen Antworten auf dieser Seite vorgeschlagen.

Wörter rückwärts löschen

Sie können auch Folgendes verwenden: d5boder d4B, wodurch 5 Wörter bzw. 4 Wörter rückwärts gelöscht werden. ( 1;ist ein Wort, aber zwei reguläre Wörter).

Reich
quelle
warum dk sowohl die aktuelle als auch die übergeordnete Zeile vollständig löscht
Aaron Shen
@ AaronShen Nein. Versuch es.
Rich
1
@Rich Wenn das für Sie funktioniert, haben Sie eine Einstellung, die diese Löschbewegung aktiviert. Ich habe es gerade mit getestet vim -u NONE -U NONEund es löscht beide Zeilen.
Vitor
@Vitor Du hast recht. Ich versuche jetzt herauszufinden, welche Einstellung dies tut.
Rich
1
Übrigens stellt sich heraus, dass die Verwendung gkals charakteristisch anscheinend erforderlich ist :set wrap(etwas kryptisch). Ich konnte nicht herausfinden, warum dies anscheinend für alle anderen funktionierte, aber nicht für mich, als die Hilfe für gkebenfalls zu implizieren schien, dass es funktionieren sollte. Der einzige Hinweis war, dass die Hauptbedeutung von gkmit umbrochenen Linien zu tun hatte. Als ich versuchte, Wrap aufzusetzen (irgendwie aus einer Laune heraus), voila, funktionierte es.
BobH
1

Ich kann noch keinen Kommentar abgeben, daher muss ich eine neue Antwort geben. Die d kvon Rich angegebenen Schlüssel funktionieren bei mir nicht, selbst wenn die nicht kompatible Option verwendet wird. Ein Grund könnte sein, dass die Bewegung kvon vim zeilenweise betrachtet wird. In diesem Fall werden beide Zeilen gelöscht. Von :help d:

Eine Ausnahme für den Befehl d {motion}: Wenn die Bewegung nicht linienweise erfolgt, befinden sich Anfang und Ende der Bewegung nicht in derselben Zeile, und es gibt nur Leerzeichen vor dem Start und nach dem Ende der Bewegung linienweise. Dies bedeutet, dass beim Löschen auch die Leerzeichen entfernt werden, von denen Sie erwarten, dass sie verbleiben. Verwenden Sie | o_v | Bediener, um die Bewegung zeichenweise zu erzwingen

Es zeigt auch das Mittel: Verwenden Sie diese Option dvk, um die Bewegung zeichenweise zu erzwingen. Das macht den Trick für mich.

Ich wusste o_v vorher nicht, also hier ist :help o_v:

v

Bei Verwendung nach einem Operator vor dem Bewegungsbefehl: Erzwingen Sie, dass der Operator zeichenweise arbeitet, auch wenn die Bewegung linienweise erfolgt. Wenn die Bewegung linienweise war, wird sie | exklusiv |. Wenn die Bewegung bereits zeichenweise war, schalten Sie inklusive / exklusiv um. Dies kann verwendet werden, um eine exklusive Bewegung inklusive und eine inklusive Bewegung exklusiv zu machen

PhilippFrank
quelle
Das "nicht kompatible" Ding war ein komplett roter Hering. Ich habe es vermasselt, als ich getestet habe, weil ich ein Idiot bin.
Rich
Wir können auch dgk verwenden, wobei gk ebenfalls exklusiv und nicht linienweise ist.
MS.Kim