Dlaczego ci ”może znajdować się poza cytowanym obszarem, a ci (działa tylko w nawiasach?

27

Podczas używania ci"kursor nie musi znajdować się w obszarze podwójnego cudzysłowu.

|String somestring = "some text";

Zakładając, że rura jest pozycją kursora, ci"spowoduje przeskok do cytowanego obszaru.

Z drugiej strony, podczas używania ci(, kursor musi znajdować się w nawiasach, aby działał i nie przesuwał kursora w nich.

Jaki jest powód tej różnicy w zachowaniu? Zakładam, że istnieje sposób odwzorowania kluczy, aby takie zachowanie było obecne. Czy mają to jakieś wady?

Rozbójnik
źródło

Odpowiedzi:

25

Główną różnicą jest to, że wyrażenia w nawiasach (celowane przez ci() mogą być zagnieżdżone, podczas gdy ciągi cytowane (celowane przez ci") nie.

Jeśli kursor znajduje się poza jakimś wyrażeniem w nawiasie, może nadal znajdować się w innym. Na przykład ( *zaznacza pozycję kursora):

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

Linia, na której znajduje się kursor, zawiera (1, 2, 3)również kursor wewnątrz większego array(...)bloku. W tym przypadku większy jest odpowiednim celem ci(.

Jeśli kursor znajduje się poza ciągiem cytowanym, ponieważ nie można go zagnieździć, nie ma nic rozsądnego do zrobienia. Tak więc Vim wykorzystuje przewagę i znajduje pierwszy cytowany ciąg w wierszu.

tommcdo
źródło
10

Rodzina cytat obiektów tekstowych ( i', i", a', i a") są inne niż reszty obiektów tekstowych, które wyglądają tylko w bieżącym wierszu. Z tego powodu postanowiono nie wymagać, aby kursor znajdował się w cudzysłowie. Zamiast tego Vim będzie szukał w wierszu do przodu, aby znaleźć cytowany ciąg, gdy kursor nie znajduje się już w jednym wierszu.

Jest dyskusja wokół niektórych poprawek, które pozwoliłyby to naprzód poszukiwania zachowanie mają być realizowane w oparciu o blokowych obiektów tekstowych, jak również.

jamessan
źródło
8

Inne odpowiedzi dotyczyły tego, dlaczego tak się dzieje. Oto dobry sposób na obejście tego.

wellle / target.vim . Niedawno znalazłem tę wtyczkę i myślę, że jest bardzo niedoceniana. Zapewnia ona nowy obiekt tekstowy: din(Mnemonic. (D) suĹ (i) nside (n) ext „(” To jest kompatybilny z innymi operatorami i różnych przedmiotów, takich jak an(, in", il((wewnątrz ostatnim nawiasie)

Zastępuje również domyślne zachowanie, i(aby najpierw sprawdzić, czy kursor znajduje się w nawiasach, a następnie, jeśli tak nie jest, działa tak samo jak in(. To zachowanie można włączyć lub wyłączyć. Na przykład:

def foo(bar):
^cursor here

Pisanie ci(działa tak samo cin(, ponieważ kursor nie znajduje się w nawiasach.

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

Akceptuje to także liczbę:

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

Wpisywanie c2in(:

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

Zapewnia to również nowy obiekt „argument”. Na przykład danaoznacza „Usuń wokół następnego argumentu”. To także akceptuje liczbę. Na przykład:

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

Wpisywanie d3ana:

def foo(arg1, arg2):
                  ^ cursor here

Istnieje wiele innych funkcji, ten plugin ma, ale to są te podstawowe.

DJMcMayhem
źródło
1
Miły! To dobry dodatek. Może będę musiał to sprawdzić.
Reaver
Świetna odpowiedź 10/10, ale muszę dać 9/10, ponieważ przykładami są python
Downgoat