let b:commentChar='//'
: यह vim में एक वैरिएबल बनाता है। b
यहाँ गुंजाइश है, जो इस मामले में बफर करने के लिए निहित है, वर्तमान में खोला फ़ाइल अर्थ को दर्शाता है। आपके टिप्पणी वर्ण तार हैं और उद्धरणों में लिपटे रहने की आवश्यकता है, उद्धरण उन बातों का हिस्सा नहीं हैं जिन्हें टिप्पणी करते समय प्रतिस्थापित किया जाएगा।
autocmd BufNewFile,BufReadPost *...
: ऑटोकॉमैंड्स अलग-अलग चीजों पर ट्रिगर करते हैं, इस मामले में, ये ट्रिगर होते हैं जब एक नई फ़ाइल या रीड फ़ाइल एक निश्चित एक्सटेंशन के साथ समाप्त होती है। एक बार ट्रिगर हो जाने के बाद, निम्न कमांड को निष्पादित करें, जो हमें commentChar
फिलाटाइप के आधार पर बदलने की अनुमति देता है । ऐसा करने के अन्य तरीके हैं, लेकिन वे नौसिखियों (मेरे जैसे) के लिए अधिक भ्रमित हैं।
function! Docomment()
: कार्य शुरू करने function
और समाप्त होने के साथ घोषित किए जाते हैं endfunction
। कार्य एक पूंजी से शुरू होना चाहिए। यह !
सुनिश्चित करता है कि यह फ़ंक्शन Docomment()
इस संस्करण के साथ परिभाषित किसी भी पिछले फ़ंक्शन को ओवरराइट करता है Docomment()
। मेरे बिना !
, मेरे पास त्रुटियां थीं, लेकिन ऐसा इसलिए हो सकता है क्योंकि मैं vim कमांड लाइन के माध्यम से नए कार्यों को परिभाषित कर रहा था।
execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e'
: निष्पादित एक कमांड को बुलाता है। इस मामले में, हम निष्पादित कर रहे हैं substitute
, जो एक सीमा ले सकता है (डिफ़ॉल्ट रूप से यह वर्तमान लाइन है) जैसे %
कि पूरे बफर के लिए या '<,'>
हाइलाइट किए गए अनुभाग के लिए। ^\s*
किसी भी राशि के व्हाट्सएप के बाद शुरू होने वाली रेखा से मेल खाने के लिए regex है, जिसे तब (कारण &
) से जोड़ा जाता है । .
यहाँ, स्ट्रिंग संयोजन के लिए इस्तेमाल के बाद से किया गया है escape()
सकते हैं उद्धरण में लिपटे नहीं किया। escape()
आपको उन चरित्रों से बचने की अनुमति देता है commentChar
जो तर्कों (इस मामले में, \
और /
) से मेल खाती हैं \
। इसके बाद, हम अपने substitute
स्ट्रिंग के अंत के साथ फिर से समतल करते हैं , जिसमें हैe
झंडा। यह ध्वज हमें चुपचाप विफल होने देता है, जिसका अर्थ है कि यदि हम किसी दिए गए लाइन पर मैच नहीं पाते हैं, तो हम इसके बारे में चिल्लाएंगे नहीं। एक पूरे के रूप में, यह पंक्ति हमें पहले पाठ से ठीक पहले एक स्थान के बाद एक टिप्पणी चरित्र डालती है, जिसका अर्थ है कि हम अपना इंडेंटेशन स्तर रखते हैं।
execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e'
: यह हमारे पिछले विशाल लंबे आदेश के समान है। इस के लिए अद्वितीय, हमारे पास है \v
, जो यह सुनिश्चित करता है कि हमें अपने से बचने की ज़रूरत नहीं है ()
, और 1
, जो हमारे द्वारा बनाए गए समूह को संदर्भित करता है ()
। मूल रूप से, हम एक ऐसी पंक्ति से मेल खाते हैं, जो किसी भी राशि के व्हाट्सएप से शुरू होती है और उसके बाद किसी भी राशि के व्हाट्सएप पर हमारे कमेंट कैरेक्टर और हम केवल व्हाट्सएप का पहला सेट रखते हैं। e
यदि हम उस लाइन पर कोई टिप्पणी चरित्र नहीं रखते हैं , तो फिर से हमें चुपचाप विफल होने दें।
let l:line=getpos("'<")[1]
: यह एक वैरिएबल को बहुत सेट करता है, जैसे हमने अपने कमेंट कैरेक्टर के साथ किया था, लेकिन l
यह लोकल स्कोप (इस फंक्शन पर लोकल) को दर्शाता है। getpos()
इस स्थिति में, हमारे हाइलाइटिंग की शुरुआत, और [1]
इसका मतलब है कि हम केवल पंक्ति संख्या के बारे में परवाह करते हैं, कॉलम नंबर जैसी अन्य चीजों की नहीं।
if match(getline(l:line), '^\s*'.b:commentChar)>-1
: आप जानते हैं कि कैसे if
काम करता है। match()
जाँच करता है कि पहली चीज़ में दूसरी चीज़ है या नहीं, इसलिए हम उस लाइन को पकड़ लेते हैं जिस पर हमने अपनी हाइलाइटिंग शुरू की है, और जाँचें कि क्या यह व्हाट्सएप के साथ शुरू होता है और उसके बाद हमारा कमेंट कैरेक्टर। match()
इंडेक्स लौटाता है जहां यह सच है, और -1
अगर कोई मैच नहीं मिला। चूंकि if
सभी गैर-संख्याओं के सही होने का मूल्यांकन करते हैं, हमें अपने आउटपुट की तुलना यह देखने के लिए करनी होगी कि क्या यह -1 से अधिक है। vim
रिटर्न में तुलना 0 अगर गलत है और 1 अगर सही है, तो वही है जो if
सही मूल्यांकन करना चाहता है।
vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>
: का vnoremap
अर्थ है दृश्य मोड में निम्न कमांड को मैप करें, लेकिन इसे पुनरावर्ती रूप से मैप न करें (मतलब किसी भी अन्य कमांड को न बदलें जो अन्य तरीकों से उपयोग कर सकते हैं)। मूल रूप से, यदि आप एक विम नौसिखिया हैं, तो हमेशा noremap
यह सुनिश्चित करने के लिए उपयोग करें कि आप चीजों को तोड़ न दें। <silent>
इसका मतलब है "मुझे आपके शब्द नहीं चाहिए, बस आपके कार्य" और यह बताता है कि कमांड लाइन में कुछ भी प्रिंट न करें। <C-r>
वह चीज़ है जो हम मैप कर रहे हैं, जो इस मामले में ctrl + r है (ध्यान दें कि आप इस मैपिंग के साथ सामान्य मोड में "redo" के लिए अभी भी Cr का उपयोग कर सकते हैं)। C-u
थोड़े भ्रामक है, लेकिन मूल रूप से यह सुनिश्चित करता है कि आप अपने दृश्य हाइलाइटिंग का ट्रैक न खोएं ( इस उत्तर के अनुसार यह आपकी आज्ञा को शुरू करता है '<,'>
जिसके साथ हम चाहते हैं)।call
यहाँ केवल हमारे द्वारा नामित फ़ंक्शन को निष्पादित करने के लिए विम को बताता है, और बटन <cr>
को हिट करने के लिए संदर्भित करता है enter
। हमें वास्तव में फ़ंक्शन को कॉल करने के लिए इसे एक बार हिट करना होगा (अन्यथा हमने केवल call function()
कमांड लाइन पर टाइप किया है, और हमें अपने सभी विकल्पों के माध्यम से जाने के लिए इसे फिर से हिट करना होगा (वास्तव में निश्चित रूप से क्यों नहीं, लेकिन जो भी हो)।