Warum kann ci "außerhalb des angegebenen Bereichs liegen und ci (funktioniert nur innerhalb von Klammern?

27

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?

Plünderer
quelle

Antworten:

25

Der Hauptunterschied besteht darin, dass Klammeraussagen (die von angesprochen werden ci() geschachtelt werden können, während Strings in Anführungszeichen (die von angesprochen werden ci") 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):

$foo = array(
    'x' => ar*ray(1, 2, 3),
);

Die Zeile, in der sich der Cursor befindet, enthält (1, 2, 3)jedoch auch den Cursor innerhalb des größeren array(...)Blocks. In diesem Fall ist der größere das geeignete Ziel für ci(.

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.

tommcdo
quelle
10

Das Zitat Familie von Textobjekten ( i', i", a'und a") 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.

Jamessan
quelle
8

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, wie an(, 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 bei in(. Dieses Verhalten kann ein- oder ausgeschaltet werden. Beispielsweise:

def foo(bar):
^cursor here

Das Eingeben ci(verhält sich genauso cin(, da sich der Cursor nicht in Klammern befindet.

def foo( ):
        ^Cursor here, and in insert mode

Dies akzeptiert auch eine Zählung:

def foo(bar):           #Define function foo(bar)
^cursor here

Eingabe c2in(:

def foo(bar):           #Define function foo( )
                                             ^cursor here

Dies liefert auch ein neues Objekt, "argument". Zum Beispiel danabedeutet "Löschen um das nächste Argument". Dies akzeptiert auch eine Zählung. Beispielsweise:

def foo(arg1, arg2, BADarg3):
^ cursor here

Eingabe d3ana:

def foo(arg1, arg2):
                  ^ cursor here

Es gibt viele andere Funktionen, die dieses Plugin bietet, aber dies sind die grundlegenden.

DJMcMayhem
quelle
1
Nett! Dies ist eine gute Ergänzung. Möglicherweise muss ich das überprüfen.
Reaver
Tolle Antwort 10/10, aber ich muss eine 9/10 geben, weil Beispiele Python sind
Downgoat