এখানে একটি ফাংশন যা আপনি চেষ্টা করতে পারেন। আমি এটি কিছুটা পরীক্ষা করেছি তবে মনে হচ্ছে এটি ঠিক আছে।
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()
কারণ এটি বাফারের শেষদিকে 'মোড়ানো' বাধা দেয়। অন্যথায় ফাংশনটি আটকে যেতে পারে কারণ এটি একই 'সাধারণ' ম্যাচগুলি সন্ধান করতে পারে তবে কোনও 'যোগ্য' ম্যাচ নেই।