Hier ist eine Funktion, die Sie ausprobieren können. Ich habe es nur ein wenig getestet, aber es scheint in Ordnung zu funktionieren.
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>)
Die Funktion ruft die Suchfunktion von Vim in einer Schleife auf, bis eine "normale" Übereinstimmung gefunden wird, die auch eine "qualifizierte" Übereinstimmung mit einem bestimmten Syntaxelement darstellt, oder bis das Ende des Puffers erreicht ist.
Es braucht zwei Argumente. Das erste ist das Suchmuster und wird unverändert an die search()
Funktion von Vim weitergegeben . Sehen Sie, :help search()
wie diese Funktion funktioniert. Das zweite Argument ist der Name des Syntaxelements, nach dem Sie diese Übereinstimmungen filtern möchten. Dies kann auch ein Muster sein und wird als regulärer Ausdruck ohne Berücksichtigung der Groß- und Kleinschreibung verglichen.
Um das Muster 'Alpha' in mathematischen Zonen zu finden, können Sie dies tun
:JJSyntaxSearch alpha texMathZone.
Das .
am Ende ist das Musteratom für jedes einzelne Zeichen, siehe :help /.
. Dies liegt daran, dass dort viele mathematische Zonensyntaxelemente usw. aufgerufen texMathZoneA
werden texMathZoneB
.
Die search()
Funktion bewegt den Cursor zur nächsten "normalen" Übereinstimmung. Dann erhält unsere Funktion alle Syntaxelement-IDs für diese neue Cursorposition mit synstack()
. Beim Durchlaufen werden die Namen der einzelnen Elemente nacheinander abgerufen und anhand des syntaxitem
Arguments getestet . Siehe :help synstack()
und :help synIDattr()
. Wenn es eine 'qualifizierte' Übereinstimmung gibt, wird die Zeilennummer zurückgegeben. Wenn es das Ende des Puffers erreicht, ohne eine 'qualifizierte' Übereinstimmung zu finden, wird es zurückgegeben 0
. Der Zweck der Funktion besteht darin, den Cursor auf die nächste 'qualifizierte' Übereinstimmung zu bringen, damit Sie dort eine Operation ausführen können. Es ist jedoch nützlich, "Zeilennummer oder 0" zurückzugeben, um anzugeben, ob es sinnvoll ist, die Funktion erneut aufzurufen, z Instanz, wenn Sie die Funktion wiederholt von einer anderen Funktion oder einem Makro aus aufrufen möchten.
Ich habe mich für das W
Flag entschieden, search()
weil es verhindert, dass das Ende des Puffers umwickelt wird. Andernfalls kann die Funktion hängen bleiben, da immer wieder dieselben "normalen" Übereinstimmungen gefunden werden, jedoch keine "qualifizierten" Übereinstimmungen.