Im normalen Modus (
und )
Umzug in den vorherigen oder nächsten ersten Zeichen im Satz ist. Wie bewege ich mich zum allerletzten Charakter?
Wenn alle meine Sätze mit einem Punkt enden, den ich verwenden kann )T.
(erstes Zeichen des nächsten Satzes, dann rückwärts zum ersten Punkt), möchte ich jedoch eine robustere Lösung für ein Makro.
Ich weiß über as
und is
im visuellen Modus Bescheid , also vis<ESC>
funktioniert es (visueller Modus, dann innerhalb des Satzes auswählen, dann visuellen Modus verlassen), aber das scheint mir ziemlich hässlich und ich kann es nicht als Bewegung mit anderen Befehlen verwenden.
Ich bin ratlos. Hilfe!
cursor-movement
cursor-motions
bsmith89
quelle
quelle
<esc>
? Du brauchst nur einen.)gE
. Ich weiß, dass Sie gesagt haben, Sie beenden Sätze immer mit einem Punkt, aber es ist besser, das nicht einmal annehmen zu müssen.as
undis
nicht nur im visuellen Modus arbeiten. Sie könnendas
im normalen Modus einen Satz löschen.Antworten:
Aus meiner Forschung dazu müssen Sie mindestens zwei benutzerdefinierte Bewegungen definieren. Der erste dient nur zum Bewegen des Cursors und der zweite zum Verwenden in Operatoren. Für ein voll funktionsfähiges Setup ist es viel komplizierter, und ich würde empfehlen, den Code in CamelCaseMotion von Ingo Karkat zu betrachten, der deutlich mehr Überlegungen dazu enthält, dies richtig zu machen als unten. Der größte Teil meiner Antwort basiert auf schnellen Informationen in der Vim-Hilfe und im Experimentieren.
In den folgenden Beispielen werde ich die
)
und(
Bewegungen neu zuordnen , um jedes Ende eines Satzes zu machen. Sie können andere Zeichen verwenden, indem Sie das Beispiel ändern. Ich gehe auch auf Ihr Beispielvis<ESC>
als die robustere Option (im Vergleich zu)T.
). Wenn Sie sich dabei bereits am Ende eines Satzes befinden, bleiben Sie am Ende, anstatt aufgrund der Funktionsweise zum Ende zu gelangenis
. Sie können versuchen, es durchas
zu ersetzen, um unterschiedliche Ergebnisse zu erzielen. Dies sollte tatsächlich funktionieren, um beide Seiten eines Textobjekts in eine Bewegung umzuwandeln.Erstens die Bewegung im normalen Modus
Hinweis Dies funktioniert nicht im visuellen Modus oder im anhängigen Bedienermodus
Zuerst definieren wir eine neue Funktion namens,
MoveToEnd
deren einzige Aufgabe darin besteht, den Cursor auf das "letzte Zeichen des zuvor geänderten oder gezogenen Textes" zu setzen, das die]
Markierung ist (siehe:help ']
).Als nächstes erstellen wir einen benutzerdefinierten Operator
\)
, der unsereMoveToEnd
Funktion für jede Bewegung aufruft , die ihm gegeben wird. Auf diese Weise wird die]
Marke zum Ende der Auswahl, die unserem neuen Bediener gegeben wird. (siehe:help map-operator
)Schließlich ordnen wir
)
unseren benutzerdefinierten Operator mit deris
Mehrheit zu, wodurch effektiv das Äquivalent von angegeben wird,vis<ESC>
ohne die letzte visuelle Auswahl zu ändern und ohne die Modi zu ändern.Das Gegenteil ist ähnlich, nur mit den anderen Richtungen:
Zweitens die Bedienerbewegung
Dieser ist schwieriger. Unsere Bewegung oben zerstört die Startposition, sodass Bediener wie 'd' gegen nichts arbeiten. Was wir brauchen, ist in der Lage zu sein, unsere Startposition zu speichern und die Endposition hinzuzufügen.
:help omap-info
(Operator Pending Mapping) gibt einen Tipp dazu, nämlich den visuellen Modus zu verwenden.Dann speichern wir unsere Position an einem Ende des visuellen Auswahlregisters, verwenden unsere Bewegung im normalen Modus von oben, stellen das andere visuelle Auswahlregister ein und aktivieren dann den visuellen Modus:
Und für unsere Rückenbewegung:
Mit dieser Option können Sie
d)
bis zum Ende des Satzes löschen (anstelle des Originals bis zum Anfang des nächsten Satzes). Alle anderen Bediener sollten ebenfalls funktionieren.quelle
Ninja Füße
Ich habe ein Plugin namens ninja-feet.vim geschrieben , das bei diesem Problem helfen soll.
Bewegliche Operatoren
Es definiert einige bewegliche Operatoren 1 , mit denen Sie Text von Ihrem Cursor bis zu einem Ende eines Textobjekts bearbeiten können . Die Verwendung von
[
oder]
zwischen dem Operator und dem Textobjekt bewirkt, dass der Operator Text vom Cursor bis zur linken bzw. rechten Grenze des Textobjekts bearbeitet.Es gibt auch Normalmodus Operatoren zum Starten Insert - Modus am Anfang oder Ende eines Textobjekts:
z[
undz]
, respectively.Beispiel 1: Wechseln Sie von hier zum Ende der Zeichenfolge
In diesem Beispiel bezeichnen wir
|
die Cursorposition.Durch Eingabe
d]i"
wird dies geändert in:d
: Verwenden Sie den Löschoperator]
: bis zum Ende des folgenden Textobjektsi"
: zitiertes String-TextobjektBeispiel 2: Beginnen Sie mit dem Einfügen nach dem aktuellen Satz
Wiederum bezeichnen wir
|
die Cursorposition.Durch Eingabe
z]is
wird der Einfügemodus am Ende des ersten Satzes gestartet.z]
: Starten Sie den Einfügemodus nach dem folgenden Textobjektis
: SatztextobjektVorsichtsmaßnahmen
.
. Es ist ziemlich knifflig und ich versuche es richtig zu machen.[
und]
(zwischen Operator und Textobjekt verwendet) funktionieren nur für Textobjekte, die miti
oder beginnena
. Technisch gesehen , das ist , weil sie wirklich Karten für[i
,]i
,[a
und]a
. Ich würde das gerne verbessern, aber es ist auch sehr schwierig..
dass die Bewegung wiederholt wird). Ich finde dieses Verhalten nicht akzeptabel.1 Ich nenne sie bewegliche Operatoren, weil sie Operatoren sind, die im Operator-Pending-Modus zugeordnet sind. Dies ist der Modus, in dem Sie zwischen der Eingabe eines Operators und einer Bewegung (z. B. zwischen
d
undw
indw
) liegen.quelle