Perché ci "può essere al di fuori dell'area quotata e ci (funziona solo tra parentesi?


27

Quando si utilizza ci"il cursore non è necessario risiedere nell'area tra virgolette doppie.

|String somestring = "some text";

Supponendo che il tubo sia la posizione del cursore, ci"lo farà saltare all'area quotata.

D'altra parte, quando si utilizza ci(, il cursore deve trovarsi tra parentesi per funzionare e non sposta il cursore al suo interno.

Qual è la ragione di questa differenza di comportamento? Presumo che ci sia un modo per mappare le chiavi in ​​modo che questo comportamento sia presente. Ci sono degli svantaggi nel fare questo?


Risposte:


25

La differenza principale qui è che le frasi tra parentesi (scelte come target ci() possono essere nidificate, mentre le stringhe tra virgolette (scelte come target ci") non possono.

Se il cursore si trova all'esterno di un'istruzione tra parentesi, potrebbe essere ancora all'interno di un'altra. Ad esempio ( *segna la posizione del cursore):

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

La linea su cui si trova il cursore contiene (1, 2, 3), ma il cursore si trova anche all'interno del array(...)blocco più grande . In questo caso, quello più grande è l'obiettivo appropriato per ci(.

Se il cursore si trova al di fuori di una stringa tra virgolette, poiché non possono essere nidificati, non c'è nulla di perfettamente sensato da fare. Quindi, Vim ne approfitta e trova la prima stringa tra virgolette sulla linea.


10

La famiglia citazione degli oggetti di testo ( i', i", a'e a") sono diverse rispetto al resto degli oggetti di testo, nel senso che guardano solo la riga corrente. Per questo motivo, è stata fatta la scelta di non richiedere che il cursore sia compreso tra virgolette. Invece, Vim cercherà in avanti all'interno della linea per trovare una stringa tra virgolette quando il cursore non è già all'interno di una.

C'è una discussione intorno ad alcune patch che consentirebbero di implementare questo comportamento di ricerca in avanti anche per oggetti di testo basati su blocchi.


8

Le altre risposte hanno spiegato perché questo accade. Ecco un bel modo per aggirare il problema.

wellle / target.vim . Di recente ho trovato questo plugin e penso che sia estremamente sottovalutato. Fornisce un nuovo oggetto di testo: din(Mnemonico:. (D) elete (i) nside (n) ext "(" Questa è compatibile con altri operatori e diversi oggetti, quali an(, in", il((all'interno ultimo parentesi)

Sovrascrive anche il comportamento predefinito in i(modo che prima guardi se il cursore è tra parentesi e, in caso contrario, funziona allo stesso modo di in(. Questo comportamento può essere attivato o disattivato. Per esempio:

def foo(bar):
^cursor here

La digitazione si ci(comporta come cin(, poiché il cursore non è tra parentesi.

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

Questo accetta anche un conteggio:

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

Digitando c2in(:

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

Ciò fornisce anche un nuovo oggetto, "argomento". Ad esempio, danasignifica "Elimina attorno all'argomento successivo". Questo accetta anche un conteggio. Per esempio:

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

Digitando d3ana:

def foo(arg1, arg2):
                  ^ cursor here

Ci sono molte altre funzionalità di questo plugin, ma queste sono quelle di base.


1
Bello! Questa è una buona aggiunta. Potrei doverlo controllare.
Reaver,

Ottima risposta 10/10 ma devo dargli un 9/10 perché gli esempi sono pitone
Downgoat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.