Como fazer com que os pares de correspondência não correspondam ao fechamento '>' em "<(>)" enquanto ainda o corresponde em "<()>"?

8

Estou usando o set matchpairs+=<:>meu código C ++ e funciona muito bem. Mas há alguns casos em que não existe, como este código C ++:

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

Aqui, se você colocar o cursor no <depois enable_if, o >in X>9será destacado. É claro que faz sentido da perspectiva do Vim, que não é um compilador C ++ nem um IDE. Mas existe alguma maneira fácil de fazer com que ele não corresponda a pares quebrados por parênteses não fechados? Ou seja, eu gostaria <()>de combinar o colchete angular de fechamento, e <(>)não.

Ruslan
fonte
só curioso, você está trabalhando com o matchit? github.com/tmhedberg/matchit , uma vez que muitas vezes resolve esse tipo de problema, mas eu não tenho certeza se ele vai ajudar no seu caso
Doktor Oswaldo
@DoktorOSwaldo no, simplesmente vim.
Ruslan

Respostas:

1

matchitprovavelmente não fará isso por você. Você provavelmente deseja escrever uma pequena função de wrapper %, que identifique o caractere sob o cursor com:

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

seguido por alguns testes aninhados simples, tais como:

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

o que significa obter scripts no vim ...

Deixe-nos saber como isso acontece.

Cbhihe
fonte