Come fare in modo che gli accoppiamenti non corrispondano alla chiusura di '>' in “<(>)” mentre si abbina ancora a “<()>”?


8

Sto usando il set matchpairs+=<:>mio codice C ++ e funziona benissimo. Ma ci sono alcuni casi in cui non è del tutto lì, come questo codice C ++:

#include <type_traits>
template<int X> typename std::enable_if<(X>9),int>::type func() { return 5; }
int main() { func<10>(); }

Qui, se si mette il cursore sul <dopo enable_if, l' >in X>9verrà evidenziato. Naturalmente ha senso dal punto di vista di Vim, che non è un compilatore C ++ né un IDE. Ma esiste un modo semplice per far sì che non corrisponda alle coppie spezzate da parentesi non chiuse? Cioè mi piacerebbe <()>abbinare la parentesi angolare di chiusura, e <(>)non.


solo curioso, stai lavorando con Matchit? github.com/tmhedberg/matchit , dal momento che spesso risolve questo tipo di problemi, ma non sono sicuro che possa aiutarti nel tuo caso
Doktor OSwaldo

@DoktorOSwaldo no, semplicemente vim.
Ruslan,

Risposte:


1

matchitmolto probabilmente non lo farà per te. Probabilmente vuoi scrivere una piccola funzione wrapper per %, che identifica il carattere sotto il cursore con:

let curChar = char2nr(matchstr(getline('.'), '\%' . col('.') . 'c.'))

seguito da un paio di semplici test nidificati in modo tale che:

test-1: if curChar is not `<`, then
     act simply the way `%` would
else 
    test-2:  if whatever lies between current `<` and following `>` contains one of ( or ) or { or } or [ or ], then
        do not jump or highlight
    else
        jump or highlight

il che significa, ottenere script in vim ...

Facci sapere come va.

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.