Löschen Sie bis zum rechten Ende des aktuellen inneren Blocks

21

Angenommen, ich habe einen Code wie diesen ( |der die Cursorposition darstellt ):

func1(x|, func2(), y); 

Ich hätte gern:

func1(x|);

Gibt es eine Möglichkeit, den Code von der Position des Cursors an die Position vor dem rechten Ende des aktuellen inneren Blocks zu löschen ?

Ich weiß, dass ich mitmachen kann, dt).aber ich frage mich, ob es eine Möglichkeit gibt, es mit dem zu mischen, was es di)tut.

Mateusz Piotrowski
quelle
1
Ich möchte wissen, ob es eine einfache Möglichkeit gibt, "die linke / rechte Hälfte des inneren / äußeren Blocks zu löschen", wie Sie gefragt haben. Aber als Randnotiz würde ich wahrscheinlich C);in diesem speziellen Fall tun .
Shahbaz,
1
Manchmal kann die %Bewegung das tun, wonach Sie suchen (dh d%).
Alxndr

Antworten:

29

ich würde ... benutzen

d])

was bedeutet, dass delete ( d) zum nächsten nicht angepassten ')' ( ])) wechselt.

Sehen :help ]).

Ryuichiro
quelle
5

Bewegungen gehen nur in eine Richtung, während Textobjekte nur in zwei Richtungen gehen.

Dies bedeutet, dass Sie nicht die Hälfte eines Textobjekts haben können, es sei denn, Sie erstellen einen benutzerdefinierten Operator für ausstehende Bewegungen, der dieses Textobjekt unter der Haube verwendet oder dessen Verhalten nachahmt.

In Ihrem Beispiel ist der von abgedeckte Text i)ziemlich einfach zu visualisieren:

func1(x, func2(), y);
      ^^^^^^^^^^^^^

aber wie würden Sie Vim anweisen, vom Cursor bis zum Ende dieses Textes zu arbeiten? Man müsste benutzerdefinierte Operatoren wie obi)und erstellen oei)(halbzufällige Beispiele).

" ()
onoremap oei) :normal! vi)o``<CR>
onoremap obi) :normal! vi)``<CR>

" []
onoremap oei] :normal! vi]o``<CR>
onoremap obi] :normal! vi]``<CR>

" {}
onoremap oei} :normal! vi}o``<CR>
onoremap obi} :normal! vi}``<CR>

" ""
onoremap oei" :normal! vi"o``<CR>
onoremap obi" :normal! vi"``<CR>

" ''
onoremap oei" :normal! vi'o``<CR>
onoremap obi" :normal! vi'``<CR>
romainl
quelle
4
Es wäre interessant, eine generische Bewegung zu erstellen, die alle bereits definierten Textobjekte in Kombination mit der aktuellen Cursorposition wiederverwendet. beispielsweise anstelle von ib, imbnach rechts und iMbnach links, und so weiter (automatisch).
VanLaser
3

Für diesen speziellen Fall würde ich dfy

Für den allgemeinen Fall:

  • dT( Löschen Sie vom Cursor an den Anfang des Blocks
  • vib Wähle den Rest des inneren Blocks aus
  • p Ersetzen Sie den inneren Block durch das, was Sie gerade gelöscht haben

Sie könnten es zu einem Mapping machen.

 :map K dt(vibp
Nathan Wilson
quelle
3

Die anderen vorhandenen Antworten hängen alle von der Definition und Erkennung eines Blocks durch vim ab. Meine Strategie für diese Art von Löschungen besteht darin, den cBefehl in Kombination mit der fBewegung und dem tatsächlichen Zeichen zu verwenden, bei dem angehalten werden soll. Dadurch wird das Stoppzeichen tatsächlich gelöscht, aber da es auch die letzte Taste war, die Sie zweimal gedrückt haben, hat dies einen Wert von nahezu Null. Dadurch wird es seit dem cWechsel in den Einfügemodus erneut eingefügt.


Mit Beispielen zu erklären, z

func1(x|, func2(), y); 

Der Befehl c2f))wird geben

func1(x)|;

Dies mag auf den ersten Blick weniger elegant erscheinen als einige der anderen Antworten. Beachten Sie jedoch, dass diese Strategie universell ist und nicht von einer Blockdefinition abhängt.


Zum Beispiel mit

<div| class="some-class">text</div>

Der Befehl cf>>wird geben

<div>|text</div>

Oder beim Bearbeiten von CSV-Dateien wie

2016-11-29,question,vi|.stackexchange.com,10435

Der Befehl cf,,wird geben

2016-11-29,question,vi,|10435

Oft benutze ich dies, um den Rest eines Strings von zu löschen

printf("Hello world| - a boring example\n");

zu

printf("Hello world\|n");

mit cf\\

oder von

print("Hello world| - a boring example");

zu

print("Hello world"|);

mit cf"".


Dies ändert die aktuelle Position an eine etwas andere Stelle als gewünscht und wechselt auch in den Einfügemodus. Aber ich wollte meinen Lösungsweg teilen, um den Rest von allem zu löschen.

hlovdal
quelle
1
Das Problem bei der cfLösung besteht darin, dass ich das Zeichen angeben muss, bei dem das Löschen beendet werden soll. Die Fragen stellt , was zu tun ist, wenn Sie nicht einfach tun können , cf)weil es eine andere ist , )bevor die )Sie wirklich wollen (zum Beispiel , wenn Sie ändern möchten , erreichen func(x|, g(x, x), x, x, g(x, x))zu func(x)). Im Grunde wollte ich wissen , ob ich vermeiden kann , drücken .nach cf).
Mateusz Piotrowski
Beachten Sie, dass Sie das angegebene Zeichen auch verwenden können, tanstatt es fzu löschen, aber nicht einzuschließen. Für Ihr erstes Beispiel ( func1(x|, func2(), y);) können Sie also einfach Folgendes verwenden d2t). Wie @MateuszPiotrowski jedoch erwähnt, handelt es sich nicht um eine allgemeine Lösung. Sie müssen wissen, auf welches Zeichen Sie löschen möchten. Wie Sie im Allgemeinen wissen, welches Zeichen den Block beendet, in dem Sie sich für eine bestimmte Sprache befinden, ist das nicht so schlimm.
Haegin
3

Das vim-ninja-feet Plugin könnte genau das sein, wonach Sie suchen. Soweit ich weiß, macht es d[und d]in "vom Cursor zum Anfang / Ende des Textobjekts d]i)löschen ", sollte also "bis zum Ende der umgebenden Klammern löschen".

Caagr98
quelle