Aqui está uma função que você pode tentar. Eu só testei um pouco, mas parece funcionar bem.
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>)
A função chama a função de pesquisa do Vim em um loop até encontrar uma correspondência 'comum' que também é uma correspondência 'qualificada' para um item de sintaxe específico ou até chegar ao final do buffer.
São necessários dois argumentos. O primeiro é o padrão de pesquisa e é passado inalterado para a search()
função do Vim . Veja :help search()
como essa função funciona. O segundo argumento é o nome do item de sintaxe no qual você deseja filtrar essas correspondências. Isso também pode ser um padrão e é comparado como uma expressão regular que não diferencia maiúsculas de minúsculas.
Para encontrar o padrão 'alfa' nas zonas matemáticas, você pode fazer
:JJSyntaxSearch alpha texMathZone.
O .
no final é o átomo padrão para qualquer caractere único, veja :help /.
. Isso ocorre porque há muitos itens de sintaxe zona matemática chamada texMathZoneA
, texMathZoneB
etc.
A search()
função move o cursor para a próxima correspondência 'comum'. Em seguida, nossa função obtém todos os IDs de item de sintaxe para essa nova posição do cursor synstack()
. Dando um loop neles, ele recupera o nome de cada item e o testa contra o syntaxitem
argumento. Veja :help synstack()
e :help synIDattr()
. Se houver uma correspondência 'qualificada', ele retornará o número da linha. Se atingir o final do buffer sem encontrar nenhuma correspondência 'qualificada', ele retornará 0
. O objetivo da função é levar o cursor para a próxima correspondência 'qualificada', para que você possa fazer alguma operação lá, mas é útil retornar "número da linha ou 0" para indicar se é significativo chamar a função novamente, por exemplo, se você quiser chamar a função repetidamente de outra função ou macro.
Eu escolhi usar o W
sinalizador para search()
isso porque ele evita 'envolver' o final do buffer. Caso contrário, a função poderá ficar paralisada, pois continua encontrando as mesmas correspondências "comuns", mas nenhuma correspondência "qualificada".