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.
cursor-movement
cursor-motions
Mateusz Piotrowski
quelle
quelle
C);
in diesem speziellen Fall tun .%
Bewegung das tun, wonach Sie suchen (dhd%
).Antworten:
ich würde ... benutzen
was bedeutet, dass delete (
d
) zum nächsten nicht angepassten ')' (])
) wechselt.Sehen
:help ])
.quelle
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:aber wie würden Sie Vim anweisen, vom Cursor bis zum Ende dieses Textes zu arbeiten? Man müsste benutzerdefinierte Operatoren wie
obi)
und erstellenoei)
(halbzufällige Beispiele).quelle
ib
,imb
nach rechts undiMb
nach links, und so weiter (automatisch).Für diesen speziellen Fall würde ich
dfy
Für den allgemeinen Fall:
dT(
Löschen Sie vom Cursor an den Anfang des Blocksvib
Wähle den Rest des inneren Blocks ausp
Ersetzen Sie den inneren Block durch das, was Sie gerade gelöscht habenSie könnten es zu einem Mapping machen.
quelle
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
c
Befehl in Kombination mit derf
Bewegung 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 demc
Wechsel in den Einfügemodus erneut eingefügt.Mit Beispielen zu erklären, z
Der Befehl
c2f))
wird gebenDies 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
Der Befehl
cf>>
wird gebenOder beim Bearbeiten von CSV-Dateien wie
Der Befehl
cf,,
wird gebenOft benutze ich dies, um den Rest eines Strings von zu löschen
zu
mit
cf\\
oder von
zu
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.
quelle
cf
Lö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 , erreichenfunc(x|, g(x, x), x, x, g(x, x))
zufunc(x)
). Im Grunde wollte ich wissen , ob ich vermeiden kann , drücken.
nachcf)
.t
anstatt esf
zu löschen, aber nicht einzuschließen. Für Ihr erstes Beispiel (func1(x|, func2(), y);
) können Sie also einfach Folgendes verwendend2t)
. 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.Das vim-ninja-feet Plugin könnte genau das sein, wonach Sie suchen. Soweit ich weiß, macht es
d[
undd]
in "vom Cursor zum Anfang / Ende des Textobjektsd]i)
löschen ", sollte also "bis zum Ende der umgebenden Klammern löschen".quelle