Wie kann man dafür sorgen, dass Streichhölzer nicht mit dem Schließen von '>' in „<(>)“ übereinstimmen, während es dennoch mit „<()>“ übereinstimmt?

8

Ich verwende set matchpairs+=<:>mit meinem C ++ - Code und es funktioniert großartig. Aber es gibt einige Fälle, in denen es nicht ganz da ist, wie dieser C ++ - Code:

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

Hier wird , wenn Sie den Cursor auf das setzen , <nachdem enable_ifdie >in X>9wird hervorgehoben. Natürlich macht es aus der Sicht von Vim Sinn, das weder ein C ++ - Compiler noch eine IDE ist. Aber gibt es eine einfache Möglichkeit, dafür zu sorgen, dass keine Paare in nicht geschlossenen Klammern gefunden werden? Dh ich möchte <()>die Schließwinkelhalterung anpassen und <(>)nicht.

Ruslan
quelle
nur neugierig, arbeitest du mit matchit? github.com/tmhedberg/matchit , da es diese Art von Problemen oft löst, aber ich bin nicht sicher, ob es in Ihrem Fall helfen wird
Doktor OSwaldo
@ DoktorOSwaldo nein, einfach nur vim.
Ruslan

Antworten:

1

matchitwird dies höchstwahrscheinlich nicht für Sie tun. Sie möchten wahrscheinlich eine kleine Wrapper-Funktion für schreiben %, die das Zeichen unter Ihrem Cursor mit Folgendem identifiziert:

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

gefolgt von ein paar einfachen verschachtelten Tests, so dass:

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

was bedeutet, erhalten Sie Skripte in vim ...

Lassen Sie uns wissen, wie das geht.

Cbhihe
quelle