रेगेक्स सर्च पैटर्न द्वारा तह


13

मुझे व्हॉट्सएप के साथ सादा टेक्स्ट फाइल मिला है, जिसमें वैल्यूज़ के कॉलम अलग हैं। ऐशे ही:

AU 3030 .... ... ....  
AU 3031 .... ... ....  
AU 3032 .... ... .... 
AU 3033 .... ... .... 
IT 48100 ... .. .....
IT 40100 ... .. .....
IT 48123 ... .. .....
UK 3333 ... ... ..... 
UK 4444 ... ... .....
UK 5555 ... ... .....

मुझे यह रेगेक्स भी मिला जो पहले कॉलम में उसी मान के साथ किसी भी सन्निकट लाइन से मेल खाएगा (मान लें कि फ़ाइल को पहले कॉलम पर सॉर्ट किया गया है) अंतिम को छोड़कर:

/^\(\([A-Z0-9]\+\)\s\+.*\n\)\(\2\)\@=

(या इसे कम "बालों वाला" बनाने के लिए):

/^\v([A-Z0-9]+)\s+.*\n(\1)@=

क्या यह उस रेखा के ऊपर रेखाएं मोड़ना संभव है जो मेल नहीं खाती थी? इस परिणाम के बाद:

+-- 4 lines AU ....
+-- 3 lines IT ....
+-- 3 lines UK ....

जवाबों:


14

एक विम स्क्रिप्ट अभिव्यक्ति सेट set foldmethod=exprकरने के 'foldexpr'लिए क्या करें और उपयोग करें जो गुना प्रारंभ बिंदुओं को परिभाषित करेगा।

set foldmethod=expr
set foldexpr=get(split(getline(v:lnum-1)),0,'')!=get(split(getline(v:lnum)),0,'')?'>1':'='

यह जितना दिखता है उससे अधिक जटिल है, क्योंकि हम आसानी से रिक्त स्थान का उपयोग नहीं कर सकते हैं :set, लेकिन रिक्त स्थान और एक नई पंक्ति या 2 के साथ, यह इस तरह दिखता है:

get(split(getline(v:lnum - 1)), 0, '') != get(split(getline(v:lnum)), 0, '')
    \ ? '>1'
    \ : '='

अवलोकन

मूल रूप से यह पिछली पंक्ति के साथ प्रत्येक पंक्ति के पहले शब्द की तुलना करता है। शब्द अलग कर रहे हैं तो लाइन, गुना के शुरू है >1। अन्यथा यह एक ही गुना स्तर रखता है =,।

विवरण की महिमा

  • set foldmethod=expr तह को निर्धारित करने के लिए विम स्क्रिप्ट अभिव्यक्ति का उपयोग करने के लिए विम को बताने के लिए
  • 'foldexpr' विकल्प विम लिपि अभिव्यक्ति को धारण करता है
  • एक टर्नरी के साथ स्थिति का मूल्यांकन करना जो >1एक गुना शुरू होना चाहिए और =जब गुना स्तर जारी रहना चाहिए
  • v:lnumमौजूदा लाइन है जो 'foldexpr'सिलवटों को अद्यतन करने के लिए चल रही है
  • सामग्री को वर्तमान लाइन ( v:lnum) और पिछली पंक्ति ( v:lnum - 1) के माध्यम से प्राप्त करेंgetline()
  • प्रत्येक पंक्ति को शब्दों के माध्यम से विभाजित करें split()
  • get()ताजा विभाजित शब्दों का पहला सूचकांक प्राप्त करने के लिए उपयोग करें
  • ''रिक्त पंक्ति के मामले में एक डिफ़ॉल्ट मान का उपयोग करें । जैसेget(words, 0, '')
  • वर्तमान रेखा के पहले शब्द की तुलना टर्नरी के स्थिति भाग में पिछली पंक्ति के पहले शब्द से करें

नोट: इस विधि में बहुत बड़े दस्तावेज़ों के साथ कुछ प्रदर्शन समस्याएँ हो सकती हैं

अधिक मदद के लिए देखें:

:h 'foldmethod'
:h 'foldexpr'
:h getline(
:h v:lnum
:h split(
:h get(
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.