Comment faire en sorte que les paires d'allumettes ne correspondent pas à la fermeture de '>' dans "<(>)" tout en les faisant correspondre dans "<()>"?

8

J'utilise set matchpairs+=<:>avec mon code C ++, et cela fonctionne très bien. Mais il y a des cas où il n'est pas tout à fait là, comme ce code C ++:

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

Ici, si vous mettez le curseur sur l' <après enable_if, l' >en X>9sera mis en surbrillance. Bien sûr, cela a du sens du point de vue de Vim, qui n'est ni un compilateur C ++ ni un IDE. Mais existe-t-il un moyen simple de ne pas faire correspondre les paires rompues par des parenthèses non fermées? C'est-à-dire que j'aimerais <()>faire correspondre le support d'angle de fermeture, et <(>)non.

Ruslan
la source
curieux, travaillez-vous avec matchit? github.com/tmhedberg/matchit , car il résout souvent ce genre de problèmes, mais je ne sais pas si cela vous aidera dans votre cas
Doktor OSwaldo
@DoktorOSwaldo non, tout simplement vim.
Ruslan

Réponses:

1

matchitne le fera probablement pas pour vous. Vous voudrez probablement écrire une petite fonction wrapper pour %, qui identifie le caractère sous votre curseur avec:

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

suivi de quelques tests imbriqués simples tels 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

ce qui signifie, obtenir des scripts dans vim ...

Faîtes-nous savoir comment cela se passe.

Cbhihe
la source