डीजे मैकमेमे के समाधान ने मुझे अपनी खुद की लिखने के लिए प्रेरित किया जो कार्य सचिवों पर निर्भर करता है और कार्य सचिवों का एक उचित विश्लेषण करने के लिए मेल खाता है।
कठिन भाग पहले ही कई वर्षों के लिए lh-dev और lh-tags द्वारा किया जा चुका है :
- वर्तमान फ़ाइल को सही विकल्पों के साथ ctags के माध्यम से पार्स किया गया है
- हम टैग डेटाबेस में सभी फ़ंक्शन परिभाषाओं की तलाश करते हैं जो वर्तमान फ़ाइल के लिए प्राप्त टैग्स तक ही सीमित है
- DB के लिए धन्यवाद, हमारे पास सभी कार्यों के लिए स्टार्ट लाइन नंबर हैं (अच्छी तरह से
template
और inline
भाग ctags द्वारा याद किया जा सकता है)
- एक साधारण पुनरावृत्त खोज के साथ (एक बाइनरी खोज की जा सकती थी, लेकिन अच्छी तरह से, फ़ाइलों को "संक्षिप्त" माना जाता है), वर्तमान फ़ंक्शन की शुरुआत पाई जाती है
- और मिलान प्लगइन के लिए धन्यवाद, इसकी अंतिम पंक्ति के रूप में अच्छी तरह से पाया जाता है - मैं देखता हूं कि सार्वभौमिक ctags एक ऐसा
end
क्षेत्र प्रदान कर रहा है जिसका उपयोग C, C ++, Python और Vim के साथ किया जा सकता है जिसका उपयोग किसी फ़ंक्शन के अंत को खोजने के लिए भी किया जा सकता है।
ध्यान दें कि इस एल्गोरिथ्म के किसी भी हिस्से को फ़ाइल-प्रकार के आधार पर ओवरराइड किया जा सकता है। अर्थात् अजगर कार्यों की सीमाओं का पता लगाने 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
में इत्यादि कर सकते हैं ।
जब यथार्थवादी C ++ फ़ंक्शन पर लागू किया जाता है तो यह ऐसा दिखता है (यानी 0 इंडेंट नहीं):
lh#dev#find_function_boundaries
lh-dev