Bagaimana membuat pasangan yang cocok tidak cocok dengan penutupan '>' di “<(>)” sambil tetap mencocokkannya di “<()>”?

8

Saya menggunakan set matchpairs+=<:>dengan kode C ++ saya, dan itu bekerja dengan baik. Tetapi ada beberapa kasus di mana itu tidak cukup di sana, seperti kode C ++ ini:

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

Di sini, jika Anda meletakkan kursor di bagian <setelah enable_if, >in X>9akan disorot. Tentu saja masuk akal dari perspektif Vim, yang bukan kompiler C ++ atau IDE. Tetapi adakah cara mudah untuk membuatnya tidak cocok dengan pasangan yang diputus oleh tanda kurung yang tidak tertutup? Yaitu saya ingin <()>mencocokkan braket sudut penutup, dan <(>)tidak.

Ruslan
sumber
hanya ingin tahu, apakah Anda bekerja dengan matchit? github.com/tmhedberg/matchit , karena sering memecahkan masalah seperti ini, tetapi saya tidak yakin apakah itu akan membantu dalam kasus Anda
Doktor OSwaldo
@DoktorOSwaldo tidak, hanya vim biasa.
Ruslan

Jawaban:

1

matchitkemungkinan besar tidak akan melakukan ini untuk Anda. Anda mungkin ingin menulis fungsi pembungkus kecil untuk %, yang mengidentifikasi karakter di bawah kursor Anda dengan:

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

diikuti oleh beberapa tes bersarang sederhana sehingga:

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

yang artinya, dapatkan skrip di vim ...

Beri tahu kami bagaimana ini.

Cbhihe
sumber