Ini adalah fungsi yang bisa Anda coba. Saya hanya mengujinya sedikit tetapi tampaknya berfungsi baik.
function! JJSyntaxSearch(pattern, syntaxitem)
while search(a:pattern, 'W') > 0
for id in synstack(line("."),col("."))
if synIDattr(id,"name") =~? a:syntaxitem
return line(".")
endif
endfor
endwhile
return 0
endfunc
command! -nargs=* JJSyntaxSearch call JJSyntaxSearch(<f-args>)
Fungsi memanggil fungsi pencarian Vim dalam satu lingkaran sampai menemukan kecocokan 'biasa' yang juga merupakan kecocokan 'terkualifikasi' dengan item sintaksis tertentu, atau sampai mencapai akhir buffer.
Dibutuhkan dua argumen. Yang pertama adalah pola pencarian dan diteruskan tidak berubah ke search()
fungsi Vim . Lihat :help search()
bagaimana fungsi itu bekerja. Argumen kedua adalah nama item sintaks di mana Anda ingin memfilter pertandingan ini. Ini juga bisa menjadi pola dan dibandingkan sebagai ekspresi reguler yang tidak peka terhadap huruf besar-kecil.
Untuk menemukan pola 'alpha' di zona matematika yang bisa Anda lakukan
:JJSyntaxSearch alpha texMathZone.
Pada .
akhirnya adalah atom pola untuk setiap karakter tunggal, lihat :help /.
. Ini karena ada banyak item sintaks zona matematika yang dipanggil texMathZoneA
, texMathZoneB
dll.
The search()
Fungsi memindahkan kursor ke pertandingan berikutnya 'biasa'. Kemudian fungsi kami mendapatkan semua ID item sintaks untuk posisi kursor baru tersebut synstack()
. Melongok melalui mereka, itu mengambil nama setiap item pada gilirannya dan mengujinya terhadap syntaxitem
argumen. Lihat :help synstack()
dan :help synIDattr()
. Jika ada kecocokan 'terkualifikasi', ia mengembalikan nomor baris. Jika mencapai akhir buffer tanpa menemukan kecocokan yang 'memenuhi syarat' itu kembali 0
. Maksud dari fungsi ini adalah untuk mengarahkan kursor ke kecocokan 'terkualifikasi' berikutnya sehingga Anda dapat melakukan beberapa operasi di sana, tetapi akan berguna untuk mengembalikan "nomor baris atau 0" untuk menunjukkan apakah memanggil fungsi itu berarti, karena Misalnya jika Anda ingin memanggil fungsi berulang kali dari fungsi lain atau makro.
Saya memilih untuk menggunakan W
flag search()
karena mencegah 'membungkus' ujung buffer. Kalau tidak, fungsi tersebut mungkin macet karena terus menemukan kecocokan 'biasa' yang sama tetapi tidak ada kecocokan 'berkualitas'.