In vim, cerca all'indietro parentesi graffe / parentesi corrispondenti


9

Come molti di voi probabilmente sapranno, è possibile utilizzare %per cercare in avanti sulla linea per trovare la parentesi graffa / parentesi / parentesi successiva accoppiata e passare al partner corrispondente:

|a|rray[index] = value;
" |e| is the cursor; hit %:
array[index|]| = value;

Spero che ci sia un tasto simile che cerca indietro sulla linea, ad esempio:

array[index] = value|;|
" |;| is the cursor again, hit the key I'm looking for:
array|[|index] = value;

La maggior parte dei comandi di vim ha sia un aspetto indietro che un avanti, quindi sembra che dovrebbe esserlo. Non ha un partner? Se è così, è perché una volta che si trova su un personaggio accoppiato si comporterebbe lo stesso?


Va notato che %non solo cerca la parentesi accoppiata sulla stessa riga, ma più in basso nel file. Mi piace soprattutto per i loop ecc. In qualsiasi linguaggio di programma preferito.
Bernhard

1
@ Bernhard Sì, ma solo quando trova una delle parentesi graffe sulla linea.
Kevin

Se non sei contrario agli script addon, l' addon matchit fornisce un g%comando che sembra simile a quello che stai cercando.
jw013,

Ma sciocco, la tua domanda afferma che vuoi sapere perché non esiste un partner. Vuoi dire "c'è qualche partner che non conosco?" :)
rjewell,

@rjewell OK, l'ho diviso, quindi tecnicamente non lo chiede più.
Kevin,

Risposte:


4

Se vuoi davvero cercare all'indietro i caratteri di corrispondenza comuni, puoi usare uno di questi vimcomandi specifici:

  • [(... (vai al (carattere precedente senza eguali )
  • [{... (vai al {carattere precedente senza eguali )

Questi due comandi hanno partner forward corrispondenti:

  • ])... (vai al prossimo )personaggio senza eguali )
  • ]}... (vai al prossimo }personaggio senza eguali )

Esistono altri comandi simili per #ifdefe per i commenti C.

Puoi trovare di più quando vimentri usando il comando :help %.


Conosco questi, il problema è che trovano coppie senza pari, ho bisogno di trovare coppie abbinate .
Kevin,

@Kevin: ho frainteso i documenti (sospiro). Naturalmente, una volta che hai usato %, va in entrambe le direzioni: trovare il partner abbinato. Inoltre, se all'interno di un blocco, i comandi precedenti troveranno la corrispondenza appropriata.
Mei,

3

% trova la parentesi corrispondente. Quindi se sei attivo (o {cercherà in avanti.

Se si è su un} o) cercherà all'indietro.

% non è direzionale, trova solo la parentesi corrispondente.


Se sono dietro un lato di una coppia,% troverà il suo partner. Se sono alla fine di una linea, non troverà la coppia prima sulla linea.
Kevin,

Non dovrebbe essere selezionata la risposta giusta?
Jack

2

Ho appena provato :map ^] ^%%(con ^]= Ctrl+ v Ctrl+ 5qui, come analogia con %= Shift+ 5).

Funziona per il caso specifico indicato, ma poiché non cerca all'indietro dal cursore, sceglierà sempre la prima parentesi aperta sulla riga e lascerà il cursore all'inizio della riga se non trova alcuna corrispondenza .


Questa è una soluzione migliore; è brutto e probabilmente c'è molto spazio per semplificare, ma penso che la semantica sia esattamente corretta (non sposta il cursore se non c'è una parentesi aperta e si sposta sulla prima parentesi aperta prima della colonna corrente).

:map ^] ^[:call search("[({[]", "bes", line("."))^M

per

  • ^]= Ctrl+ v Ctrl+5
  • ^[= Ctrl+v Esc
  • ^M= Ctrl+v Return

Questo non sarà esattamente lo stesso se ci sono due coppie non nidificate su una linea, ma sicuramente è il miglior suggerimento finora, grazie.
Kevin,

Funzionerà solo all'interno di un blocco, giusto? Se è così, allora [(funzionerebbe altrettanto bene e non richiede a map.
Mei,

Dovrebbe esserci un blocco che inizia sulla riga corrente, sì. Ho trovato una soluzione più completa, modifica in arrivo ...
Inutile
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.