ডিজে ম্যাকমেহেমের সমাধান আমাকে নিজের লেখার জন্য অনুপ্রাণিত করেছিল যা সিটি্যাগগুলিতে এবং ম্যাচের উপর নির্ভর করে ফাংশন সীমানার সঠিক বিশ্লেষণ করতে।
ইতিমধ্যে বেশ কয়েকটি বছর lh-dev এবং lh-ট্যাগ দ্বারা কঠিন অংশটি করা হয়েছে :
- বর্তমান ফাইলটি সঠিক বিকল্পগুলির সাথে ctags এর মাধ্যমে পার্স করা হয়েছে
- আমরা ট্যাগ্স ডাটাবেসে সমস্ত ফাংশন সংজ্ঞা খুঁজছি যা বর্তমান ফাইলের জন্য প্রাপ্ত ট্যাগগুলিতে সীমাবদ্ধ
- ডিবিকে ধন্যবাদ, আমাদের সকল ফাংশনের জন্য স্টার্ট লাইন নম্বর রয়েছে (ভাল
template
এবং inline
অংশটি সিটি্যাগ দ্বারা মিস করা যেতে পারে)
- একটি সাধারণ পুনরাবৃত্ত অনুসন্ধান সহ (একটি বাইনারি অনুসন্ধান করা যেতে পারে, তবে ভাল, ফাইলগুলি "সংক্ষিপ্ত" বলে মনে করা হয়), বর্তমান ফাংশনের শুরুটি পাওয়া গেছে
- এবং ম্যাচইট প্লাগইনকে ধন্যবাদ, এর চূড়ান্ত লাইনটিও পাওয়া গেছে - আমি দেখতে পাচ্ছি যে সার্বজনীন ctags এমন একটি
end
ক্ষেত্র অফার করছে যা সি, সি ++, পাইথন এবং ভিমের সাথে ব্যবহার করা যেতে পারে যা কোনও ফাংশনের শেষ সন্ধান করতেও ব্যবহৃত হতে পারে।
নোট করুন যে এই অ্যালগরিদমের কোনও অংশ ফাইল-টাইপের ভিত্তিতে ওভাররাইড করা যেতে পারে। অর্থাত পাইথন ফাংশনগুলির সীমানা সনাক্তকরণ def
ইনডেন্টেশন অনুসন্ধান করতে পারে এবং এটি বিশ্লেষণ করতে পারে, আমরা কেবল function
জাভাস্ক্রিপ্টে অনুসন্ধান করতে পারি এবং এরকমভাবে - অন্য কথায়, বর্তমান সংস্করণটি জাভা, ভিম এবং কিছু অন্যান্য ভাষার সাথেও কাজ করে (আমার এখনও কিছু কাজ আছে পাইথনের জন্য করতে)
সুতরাং আমি এখন দুটি নতুন ম্যাপিং সংজ্ঞা দিচ্ছি: ভিজ্যুয়াল মোড ম্যাপিং এবং অপারেটর-মুলতুবি মোড ম্যাপিং:
onoremap <silent> if :<c-u>call lh#dev#_select_current_function()<cr>
xnoremap <silent> if :<c-u>call lh#dev#_select_current_function()<cr><esc>gv
যা নির্ভর করে:
function! lh#dev#_select_current_function() abort
let fn = lh#dev#find_function_boundaries(line('.'))
exe fn.lines[0]
normal! v
exe fn.lines[1]
endfunction
আমি আপনাকে কয়েকশ লাইনের কোড অফ করে রেখেছি lh#dev#find_function_boundaries()
এবং ডিজে ম্যাকমেহেমের ম্যাপিংয়ের জন্য ধন্যবাদ
" Note that my vim settings requires two backslashes here instead of one
vnoremap / <esc>/\\%V
আমরা বর্তমান ফাংশনটি vif/pattern
অনুসন্ধান করতে একটি করতে পারি pattern
।
আমরা এর সাথে ফাংশনগুলি মুছে ফেলতে পারি dif
, তাদের সাথে ইঙ্ক করা yif
ইত্যাদি can
বাস্তববাদী সি ++ ফাংশনে প্রয়োগ করার সময় এটি দেখতে কেমন লাগে তা এখানে (উদাহরণস্বরূপ 0 টি ইন্ডেন্ট করা হয়নি):
lh#dev#find_function_boundaries