ここにあなたが試すことができる関数があります。少しだけテストしましたが、問題なく動作するようです。
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>)
この関数は、特定の構文項目に対する「修飾された」一致でもある「通常の」一致が見つかるまで、またはバッファの最後に到達するまで、ループでVimの検索関数を呼び出します。
2つの引数を取ります。1つ目は検索パターンで、変更せずにVimのsearch()
関数に渡されます。:help search()
その機能のしくみについては、を参照してください。2番目の引数は、これらの一致をフィルタリングする構文アイテムの名前です。これはパターンにすることもでき、大文字と小文字を区別しない正規表現として比較されます。
あなたができる数学ゾーンでパターン「アルファ」を見つけるために
:JJSyntaxSearch alpha texMathZone.
.
最後には、任意の単一文字を参照するためのパターン原子です:help /.
。これはtexMathZoneA
、texMathZoneB
などと呼ばれる多くの数学ゾーン構文項目があるためです。
このsearch()
関数は、カーソルを次の「通常の」一致に移動します。次に、関数はを使用して、その新しいカーソル位置のすべての構文アイテムIDを取得しますsynstack()
。それらをループして、各項目の名前を順番に取得し、syntaxitem
引数に対してテストします。:help synstack()
およびを参照してください:help synIDattr()
。「修飾された」一致がある場合は、行番号を返します。「修飾された」一致が見つからないままバッファの最後に到達すると、が返されます0
。関数のポイントは、カーソルを次の「修飾された」一致に移動して、そこでいくつかの操作を実行できるようにすることですが、「行番号または0」を返し、関数を再度呼び出すことが意味があるかどうかを示すと便利です。別の関数またはマクロから関数を繰り返し呼び出したい場合のインスタンス。
W
フラグを使用することを選択したのsearch()
は、バッファの終わりを「折り返す」のを防ぐためです。そうしないと、同じ「通常の」一致は検出されますが、「修飾された」一致は検出されないため、関数がスタックする場合があります。