Oto funkcja, którą możesz wypróbować. Testowałem to tylko trochę, ale wydaje się, że działa dobrze.
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>)
Funkcja wywołuje funkcję wyszukiwania Vima w pętli, dopóki nie znajdzie „zwykłego” dopasowania, które jest również „kwalifikowanym” dopasowaniem do określonego elementu składni lub dopóki nie osiągnie końca bufora.
Wymaga dwóch argumentów. Pierwszy to wzorzec wyszukiwania i jest on przekazywany bez zmian do search()funkcji Vima . Zobacz, :help search()jak działa ta funkcja. Drugi argument to nazwa elementu składni, na którym chcesz filtrować te dopasowania. Może to być również wzorzec i jest porównywany jako wyrażenie regularne bez rozróżniania wielkości liter.
Aby znaleźć wzór „alfa” w strefach matematycznych, możesz to zrobić
:JJSyntaxSearch alpha texMathZone.
Na .końcu znajduje się atom wzoru dla każdego pojedynczego znaku, patrz :help /.. To dlatego, że wiele elementów składniowych strefa matematyki nazywa texMathZoneA, texMathZoneBetc.
search()Funkcja przesuwa kursor do następnego „zwykłym” meczu. Następnie nasza funkcja pobiera wszystkie identyfikatory pozycji składni dla tej nowej pozycji kursora za pomocą synstack(). Pętląc je, pobiera po kolei nazwę każdego elementu i testuje go pod syntaxitemkątem argumentu. Zobacz :help synstack()i :help synIDattr(). Jeśli istnieje dopasowanie „kwalifikowane”, zwraca numer linii. Jeśli osiągnie koniec bufora bez znalezienia „dopasowanego” dopasowania, zwraca 0. Celem funkcji jest przesunięcie kursora do następnego dopasowania „kwalifikowanego”, aby można było tam wykonać jakąś operację, ale warto zwrócić „numer linii lub 0”, aby wskazać, czy sensowne jest ponowne wywołanie funkcji, ponieważ wystąpienie, jeśli chcesz wywoływać funkcję wielokrotnie z innej funkcji lub makra.
Zdecydowałem się użyć Wflagi do, search()ponieważ zapobiega to owijaniu się końca bufora. W przeciwnym razie funkcja może utknąć, ponieważ ciągle znajduje te same „zwykłe” dopasowania, ale nie ma „kwalifikowanych” dopasowań.