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()कमांड लाइन पर टाइप किया है, और हमें अपने सभी विकल्पों के माध्यम से जाने के लिए इसे फिर से हिट करना होगा (वास्तव में निश्चित रूप से क्यों नहीं, लेकिन जो भी हो)।