İşte deneyebileceğiniz bir işlev. Ben sadece biraz test ettik ama işe yarıyor gibi görünüyor.
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>)
İşlev, belirli bir sözdizimi öğesiyle 'nitelikli' eşleşme olan 'sıradan' bir eşleşme bulana kadar veya arabellek sonuna ulaşıncaya kadar Vim'in arama işlevini bir döngüde çağırır.
İki argüman alır. Birincisi arama örüntüsüdür ve değişmeden Vim search()
işlevine geçirilir . Bkz :help search()
o işlevin nasıl için. İkinci argüman, bu eşleşmeleri filtrelemek istediğiniz sözdizimi öğesinin adıdır. Bu aynı zamanda bir model olabilir ve büyük / küçük harf duyarsız bir düzenli ifade olarak karşılaştırılır.
Matematik bölgelerinde 'alfa' desenini bulmak için şunları yapabilirsiniz
:JJSyntaxSearch alpha texMathZone.
.
Ucunda tek bir karakter için model atomu, bkz :help /.
. Bunun nedeni texMathZoneA
, texMathZoneB
vb. Adı verilen birçok matematik bölgesi sözdizimi öğesinin olmasıdır .
search()
Fonksiyon sonraki 'sıradan' maç için imleci hareket ettirir. Daha sonra işlevimiz, yeni imleç konumu için tüm sözdizimi öğe kimliklerini alır synstack()
. Bunların üzerinden geçerek, her bir öğenin adını sırayla alır ve syntaxitem
tartışmaya karşı test eder . Bkz :help synstack()
ve :help synIDattr()
. 'Nitelikli' bir eşleşme varsa, satır numarasını döndürür. Herhangi bir 'kalifiye' eşleşme bulmadan tamponun sonuna ulaşırsa geri döner 0
. İşlevin amacı imleci bir sonraki 'kalifiye' eşleşmeye götürmektir, böylece orada bir işlem yapabilirsiniz, ancak işlevi tekrar çağırmanın anlamlı olup olmadığını belirtmek için "satır numarası veya 0" döndürmek yararlıdır. örneğin, işlevi başka bir işlevden veya makrodan tekrar tekrar çağırmak istiyorsanız.
Kullanmak için tercih W
için bayrağı search()
'etrafında sarma' çünkü o Kireçlenmeyi önler tampon ucu. Aksi takdirde, aynı 'sıradan' eşleşmeleri bulmaya devam ettiği, ancak 'nitelikli' eşleşmeleri bulunmadığı için işlev sıkışabilir.