Ecco una funzione che potresti provare. L'ho provato solo un po ', ma sembra funzionare bene.
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 funzione chiama la funzione di ricerca di Vim in un ciclo fino a quando non trova una corrispondenza "normale" che è anche una corrispondenza "qualificata" con un particolare elemento di sintassi o fino a quando non raggiunge la fine del buffer.
Ci vogliono due argomenti. Il primo è il modello di ricerca e viene passato invariato alla search()
funzione di Vim . Scopri :help search()
come funziona quella funzione. Il secondo argomento è il nome dell'elemento di sintassi su cui si desidera filtrare queste corrispondenze. Questo può anche essere un modello ed è confrontato come un'espressione regolare senza distinzione tra maiuscole e minuscole.
Per trovare lo schema 'alfa' nelle zone matematiche che puoi fare
:JJSyntaxSearch alpha texMathZone.
Alla .
fine è l'atomo modello per ogni singolo personaggio, vedi :help /.
. Questo perché ci sono molti elementi di sintassi della zona matematica chiamati texMathZoneA
, texMathZoneB
ecc.
La search()
funzione sposta il cursore sulla corrispondenza 'ordinaria' successiva. Quindi la nostra funzione ottiene tutti gli ID degli elementi di sintassi per quella nuova posizione del cursore con synstack()
. Effettuando un ciclo tra loro, recupera a turno il nome di ciascun elemento e lo verifica con l' syntaxitem
argomento. Vedi :help synstack()
e :help synIDattr()
. Se esiste una corrispondenza "qualificata", viene restituito il numero di riga. Se raggiunge la fine del buffer senza trovare alcuna corrispondenza "qualificata", viene restituito 0
. Il punto della funzione è di portare il cursore sulla corrispondenza 'qualificata' successiva in modo da poter eseguire qualche operazione lì, ma è utile restituire "numero di riga o 0" per indicare se è significativo chiamare nuovamente la funzione, per istanza se si desidera chiamare ripetutamente la funzione da un'altra funzione o una macro.
Ho scelto di usare il W
flag per il search()
perché impedisce di "avvolgere" la fine del buffer. Altrimenti la funzione potrebbe rimanere bloccata poiché continua a trovare le stesse corrispondenze "normali" ma nessuna corrispondenza "qualificata".