से :help 'foldexpr'
:
प्रत्येक लाइन के लिए इसका गुना स्तर प्राप्त करने के लिए इसका मूल्यांकन किया जाता है
foldexpr
मूल्यांकन किया जाता है, तो यह VimL कोड की जरूरत है; "विशेष वाक्यविन्यास" या इस तरह का कोई उल्लेख नहीं है। इस मूल्यांकन का परिणाम यह नियंत्रित करता है कि विम किस तह को मानता है या नहीं।
संभावित मूल्य हैं
0 the line is not in a fold
1, 2, .. the line is in a fold with this level
"<1", "<2", .. a fold with this level ends at this line
">1", ">2", .. a fold with this level starts at this line
यह वह जगह है नहीं पूरी सूची; आपके प्रश्न में केवल उदाहरणों में उपयोग किए गए हैं। :help foldexpr
पूरी सूची देखें
प्रथम
एक बार जब हम कुछ रिक्त स्थान जोड़ते हैं और एक :set
कमांड में इस काम को करने की आवश्यकता होती है, तो पहले वाला काफी सरल होता है :
getline(v:lnum)[0] == "\t"
getline(v:lnum)
पूरी लाइन हो जाती है।
[0]
उस का पहला चरित्र हो जाता है
- और
== "\t"
जाँचता है कि क्या एक टैब वर्ण है।
- VimL में "सत्य" या "असत्य" नहीं है, यह सिर्फ "0" का उपयोग करता है, और "1" के लिए सच है। इसलिए यदि यह रेखा एक टैब से शुरू होती है, तो इसे फोल्डवेल 1 से जोड़ दिया जाता है। यदि ऐसा नहीं होता है, तो यह फोल्ड (0) में नहीं है।
यदि आप टैब की संख्या की गणना करने के लिए इसका विस्तार करेंगे तो आपके पास इंडेंटेशन-आधारित फोल्डिंग होगी (कम से कम, जब expandtab
सक्षम नहीं है)।
तीसरा
तीसरा एक वास्तव में पहले वाले के रूप में अधिक जटिल नहीं है; पहले उदाहरण के साथ, हम पहले इसे और अधिक पठनीय बनाना चाहते हैं:
getline(v:lnum) =~ '^\s*$' && getline(v:lnum + 1) =~ '\S' ? '<1' : 1
- हमें पूरी लाइन मिलती है
getline(v:lnum)
- हम साथ एक regexp रूप से मेल खाने वाले
=~
के लिए '^\s*$'
; ^
शुरुआत के लिए लंगर, \s
किसी भी व्हाट्सएप चरित्र का *
मतलब है, पिछले शून्य या अधिक बार दोहराएं, और $
अंत तक लंगर डाले। तो यह regexp रिक्त लाइनों या लाइनों के लिए केवल व्हाट्सएप से मेल खाता है ।
getline(v:lnum + 1)
अगली पंक्ति मिलती है ।
- हम इसके साथ मेल खाते हैं
\S
, जो इस लाइन पर कहीं भी किसी भी गैर-व्हाट्सएप चरित्र से मेल खाता है।
- यदि ये 2 स्थितियाँ सत्य हैं, तो हम इसका मूल्यांकन करते हैं
<1
, अन्यथा 1
। यह if
सी और कुछ अन्य भाषाओं से ज्ञात "टर्नरी" के साथ किया जाता है condition ? return_if_true : return_if_false
:।
<1
इसका मतलब है कि इस लाइन पर एक फोल्ड समाप्त होता है, और 1
फोल्डवेल का मतलब है।
तो, अगर हम एक रेखा को समाप्त करते हैं यदि रेखा खाली है और अगली पंक्ति रिक्त नहीं है । अन्यथा, हम फोल्डवेल पर हैं 1. या, जैसा :h foldexpr
कि यह कहते हैं:
यह रिक्त लाइनों द्वारा अलग किए गए पैराग्राफ से एक गुना बना देगा
चौथा
चौथा तीसरे के समान ही व्यवहार करता है, लेकिन इसे थोड़ा अलग तरीके से करता है। विस्तारित, यह है:
getline(v:lnum - 1) =~ '^\s*$' && getline(v:lnum) =~ '\S' ? '>1' : 1
यदि पिछली पंक्ति एक रिक्त रेखा है, और वर्तमान रेखा एक गैर-रिक्त रेखा है, तो हम इस रेखा पर एक गुना शुरू करते हैं ( >1
), यदि नहीं, तो हम 1 के लिए फेरलवेल सेट कर रहे हैं।
अंतभाषण
इसलिए सभी 3 उदाहरणों पर तर्क वास्तव में काफी सरल है। अधिकांश कठिनाई रिक्त स्थान की कमी और कुछ बैकस्लैश उपयोग में आती है।
मुझे संदेह है कि किसी फ़ंक्शन को कॉल करने का कुछ ओवरहेड है, और चूंकि इसका मूल्यांकन प्रत्येक पंक्ति के लिए किया जाता है जो आप एक अच्छा प्रदर्शन करना चाहते हैं। मैं नहीं जानता कि आधुनिक मशीनों पर कितना बड़ा अंतर है, और यह अनुशंसा करेगा कि आप एक फ़ंक्शन का उपयोग करें (जैसा कि 2 उदाहरण में) जब तक आप प्रदर्शन की समस्या नहीं करते हैं। द नूथ को याद रखें: "समयपूर्व अनुकूलन सभी बुराई की जड़ है" ।
यह सवाल स्टैकऑवरफ्लो पर भी है , जिसका जवाब थोड़ा अलग है। लेकिन मेरा पाठ्यक्रम बेहतर है ;-)