Aquí hay una función que puedes probar. Solo lo probé un poco, pero parece funcionar bien.
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 función llama a la función de búsqueda de Vim en un bucle hasta que encuentra una coincidencia 'ordinaria' que también es una coincidencia 'calificada' con un elemento de sintaxis particular, o hasta que llega al final del búfer.
Se necesitan dos argumentos. El primero es el patrón de búsqueda y se pasa sin cambios a la search()función de Vim . Vea :help search()cómo funciona esa función. El segundo argumento es el nombre del elemento de sintaxis en el que desea filtrar estas coincidencias. Esto también puede ser un patrón y se compara como una expresión regular que no distingue entre mayúsculas y minúsculas.
Para encontrar el patrón 'alfa' en zonas matemáticas puedes hacer
:JJSyntaxSearch alpha texMathZone.
Al .final es el átomo de patrón para cualquier carácter individual, vea :help /.. Esto es porque hay muchos elementos de sintaxis de zona matemática llamados texMathZoneA, texMathZoneBetc.
La search()función mueve el cursor a la siguiente coincidencia 'ordinaria'. Luego, nuestra función obtiene todas las ID de elementos de sintaxis para esa nueva posición del cursor con synstack(). Al recorrerlos, recupera el nombre de cada elemento a su vez y lo prueba contra el syntaxitemargumento. Ver :help synstack()y :help synIDattr(). Si hay una coincidencia 'calificada', devuelve el número de línea. Si llega al final del búfer sin encontrar ninguna coincidencia 'calificada', regresa 0. El objetivo de la función es llevar el cursor a la siguiente coincidencia 'calificada' para que pueda realizar alguna operación allí, pero es útil devolver "número de línea o 0" para indicar si es significativo volver a llamar a la función, por instancia si desea llamar a la función repetidamente desde otra función o una macro.
Elegí usar la Wbandera para el search()porque evita 'envolver' el final del búfer. De lo contrario, la función podría atascarse ya que sigue encontrando las mismas coincidencias "normales" pero no coincidencias "calificadas".