¿Cómo hacer que los pares de coincidencias no coincidan con el cierre '>' en “<(>)” sin dejar de coincidir en “<()>”?

8

Estoy usando set matchpairs+=<:>mi código C ++, y funciona muy bien. Pero hay algunos casos en los que no está del todo allí, 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>(); }

En este caso, si se pone el cursor en el <después enable_if, el >de X>9se resaltará. Por supuesto, tiene sentido desde la perspectiva de Vim, que no es un compilador de C ++ ni un IDE. Pero, ¿hay alguna manera fácil de hacer que no coincida con pares rotos por paréntesis no cerrados? Es decir, me gustaría <()>hacer coincidir el soporte angular de cierre, y <(>)no.

Ruslan
fuente
Por curiosidad, ¿estás trabajando con Matchit? github.com/tmhedberg/matchit , ya que a menudo resuelve este tipo de problemas, pero no estoy seguro de si ayudará en su caso
Doktor OSwaldo
@DoktorOSwaldo no, simplemente vim.
Ruslan

Respuestas:

1

matchitprobablemente no hará esto por ti. Probablemente desee escribir una función de contenedor pequeña para %, que identifica el carácter debajo de su cursor con:

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

seguido de un par de pruebas simples anidadas de manera que:

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

lo que significa, obtener secuencias de comandos en vim ...

Háganos saber cómo va esto.

Cbhihe
fuente