Voici une fonction que vous pourriez essayer. Je l'ai seulement testé un peu, mais cela semble fonctionner correctement.
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>)
La fonction appelle la fonction de recherche de Vim dans une boucle jusqu'à ce qu'elle trouve une correspondance «ordinaire» qui est également une correspondance «qualifiée» à un élément de syntaxe particulier, ou jusqu'à ce qu'elle atteigne la fin du tampon.
Il faut deux arguments. Le premier est le modèle de recherche et il est transmis tel quel à la search()
fonction de Vim . Voir :help search()
comment cette fonction fonctionne. Le deuxième argument est le nom de l'élément de syntaxe sur lequel vous souhaitez filtrer ces correspondances. Cela peut également être un modèle et est comparé comme une expression régulière insensible à la casse.
Pour trouver le motif «alpha» dans les zones mathématiques, vous pouvez le faire
:JJSyntaxSearch alpha texMathZone.
À .
la fin est l'atome de modèle pour n'importe quel caractère unique, voir :help /.
. En effet, de nombreux éléments de syntaxe de zone mathématique sont appelés texMathZoneA
, texMathZoneB
etc.
La search()
fonction déplace le curseur sur la prochaine correspondance «ordinaire». Ensuite, notre fonction obtient tous les ID d'élément de syntaxe pour cette nouvelle position de curseur avec synstack()
. En les parcourant, il récupère tour à tour le nom de chaque élément et le teste par rapport à l' syntaxitem
argument. Voir :help synstack()
et :help synIDattr()
. S'il existe une correspondance «qualifiée», elle renvoie le numéro de ligne. S'il atteint la fin du tampon sans trouver de correspondance «qualifiée», il revient 0
. Le but de la fonction est de placer le curseur sur la prochaine correspondance «qualifiée» afin que vous puissiez y effectuer certaines opérations, mais il est utile de renvoyer «numéro de ligne ou 0» pour indiquer s'il est utile d'appeler à nouveau la fonction, par exemple par exemple si vous souhaitez appeler la fonction à plusieurs reprises à partir d'une autre fonction ou d'une macro.
J'ai choisi d'utiliser l' W
indicateur pour le search()
car il empêche de «contourner» la fin du tampon. Sinon, la fonction peut rester bloquée car elle continue de trouver les mêmes correspondances «ordinaires» mais aucune correspondance «qualifiée».