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
, texMathZoneB
etc.
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 syntaxitem
argumento. 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 W
bandera 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".