Bei Verwendung ci"des Cursors muss sich dieser nicht im doppelt zitierten Bereich befinden.
|String somestring = "some text";
Angenommen, die Pipe ist die Cursorposition, ci"wird zum angegebenen Bereich gesprungen.
Andererseits ci(muss sich der Cursor bei der Verwendung in den Klammern befinden, damit er funktioniert, und bewegt den Cursor nicht in diesen Klammern.
Was ist der Grund für diesen Verhaltensunterschied? Ich gehe davon aus, dass es eine Möglichkeit gibt, die Schlüssel so zuzuordnen, dass dieses Verhalten vorliegt. Gibt es dabei irgendwelche Nachteile?
cursor-motions
cursor-movement
Plünderer
quelle
quelle
Antworten:
Der Hauptunterschied besteht darin, dass Klammeraussagen (die von angesprochen werden
ci(
) geschachtelt werden können, während Strings in Anführungszeichen (die von angesprochen werdenci"
) nicht geschachtelt werden können.Wenn sich Ihr Cursor außerhalb einer Klammer befindet, befindet er sich möglicherweise immer noch innerhalb einer anderen. Zum Beispiel (
*
markiert die Cursorposition):Die Zeile, in der sich der Cursor befindet, enthält
(1, 2, 3)
jedoch auch den Cursor innerhalb des größerenarray(...)
Blocks. In diesem Fall ist der größere das geeignete Ziel fürci(
.Befindet sich der Cursor außerhalb einer Zeichenfolge in Anführungszeichen, da diese nicht verschachtelt werden kann, ist dies nicht sinnvoll. Vim nutzt also den Vorteil und findet die erste in Anführungszeichen gesetzte Zeichenfolge in der Zeile.
quelle
Das Zitat Familie von Textobjekten (
i'
,i"
,a'
unda"
) ist anders als der Rest der Textobjekte, dass sie an der aktuellen Linie schauen nur. Aus diesem Grund wurde die Entscheidung getroffen, dass sich der Cursor nicht innerhalb der Anführungszeichen befinden muss. Stattdessen sucht Vim in der Zeile nach einer Zeichenfolge in Anführungszeichen, wenn sich der Cursor noch nicht in einer befindet.Es wird über einige Patches diskutiert , mit denen dieses Forward-Search-Verhalten auch für blockbasierte Textobjekte implementiert werden kann.
quelle
Die anderen Antworten deckten ab, warum dies geschieht. Hier ist ein guter Weg, um das Problem zu umgehen.
wellle / goals.vim . Ich habe dieses Plugin erst kürzlich gefunden und finde es extrem unterschätzt. Es bietet ein neues Textobjekt:
din(
Mnemonic:. (D) elete (i) nside (n) ext "(" Dies ist kompatibel mit anderen Betreibern und verschiedenen Gegenständen, wiean(
,in"
,il(
(innen letzter Klammer)Außerdem wird das Standardverhalten von überschrieben,
i(
sodass zunächst geprüft wird, ob sich der Cursor in Klammern befindet. Wenn dies nicht der Fall ist, funktioniert dies auf die gleiche Weise wie beiin(
. Dieses Verhalten kann ein- oder ausgeschaltet werden. Beispielsweise:Das Eingeben
ci(
verhält sich genausocin(
, da sich der Cursor nicht in Klammern befindet.Dies akzeptiert auch eine Zählung:
Eingabe
c2in(
:Dies liefert auch ein neues Objekt, "argument". Zum Beispiel
dana
bedeutet "Löschen um das nächste Argument". Dies akzeptiert auch eine Zählung. Beispielsweise:Eingabe
d3ana
:Es gibt viele andere Funktionen, die dieses Plugin bietet, aber dies sind die grundlegenden.
quelle