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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.