यहाँ एक फ़ंक्शन है जिसे आप आज़मा सकते हैं। मैंने केवल इसका थोड़ा परीक्षण किया है, लेकिन यह ठीक काम करता है।
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>)
फ़ंक्शन एक लूप में विम के खोज फ़ंक्शन को तब तक कॉल करता है जब तक कि वह एक 'साधारण' मैच नहीं पाता है जो किसी विशेष वाक्यविन्यास आइटम के लिए 'योग्य' मैच है, या जब तक कि यह बफर के अंत तक नहीं पहुंचता है।
यह दो तर्क लेता है। पहला सर्च पैटर्न है और इसे विम के search()
फंक्शन में अपरिवर्तित रखा गया है । देखें :help search()
कि यह कैसे काम करता है। दूसरा तर्क सिंटैक्स आइटम का नाम है जिस पर आप इन मैचों को फ़िल्टर करना चाहते हैं। यह एक पैटर्न भी हो सकता है और इसकी तुलना केस-असंवेदनशील नियमित अभिव्यक्ति के रूप में की जाती है।
गणित क्षेत्रों में पैटर्न 'अल्फा' को खोजने के लिए आप कर सकते हैं
:JJSyntaxSearch alpha texMathZone.
.
अंत में किसी भी एक वर्ण के लिए पैटर्न परमाणु है, देखते हैं :help /.
। ऐसा इसलिए है क्योंकि वहाँ कई गणित क्षेत्र वाक्यविन्यास आइटम कहा जाता है texMathZoneA
, texMathZoneB
आदि।
search()
समारोह अगले 'साधारण' मैच के लिए कर्सर ले जाता है। तब हमारे फ़ंक्शन को उस नए कर्सर स्थिति के लिए सभी सिंटैक्स आइटम आईडी मिलते हैं synstack()
। उनके माध्यम से लूपिंग, यह बदले में प्रत्येक आइटम का नाम पुनर्प्राप्त करता है और syntaxitem
तर्क के खिलाफ परीक्षण करता है। देखें :help synstack()
और :help synIDattr()
। यदि कोई 'योग्य' मैच है तो वह लाइन नंबर देता है। यदि यह बिना किसी 'योग्य' मिलान के बफर के अंत तक पहुँचता है, तो यह रिटर्न करता है 0
। फ़ंक्शन का बिंदु कर्सर को अगले 'योग्य' मैच के लिए प्राप्त करना है ताकि आप वहां कुछ ऑपरेशन कर सकें, लेकिन यह इंगित करने के लिए "लाइन नंबर या 0" वापस करना उपयोगी है कि क्या फ़ंक्शन को फिर से कॉल करना सार्थक है, के लिए उदाहरण यदि आप फ़ंक्शन को किसी अन्य फ़ंक्शन या मैक्रो से बार-बार कॉल करना चाहते हैं।
मैंने W
ध्वज का उपयोग करने के लिए चुना search()
क्योंकि यह बफर के अंत में 'लपेटने' को रोकता है। अन्यथा फ़ंक्शन अटक सकता है क्योंकि यह समान 'साधारण' मैचों को ढूंढता रहता है लेकिन कोई 'योग्य' मैच नहीं।