¿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.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.