आप निम्न आदेश आज़मा सकते हैं:
:let c=0 | g/^* /let c+=1 | s//\=c.'. '
पहले यह वैरिएबल c
( let c=0
) को इनिशियलाइज़ करता है , फिर यह ग्लोबल कमांड को निष्पादित करता है g
जो पैटर्न ^*
(लाइन की शुरुआत, इसके बाद एक तारांकन और एक स्थान) के लिए दिखता है ।
जब भी इस पैटर्न रखने वाली पंक्ति पाया जाता है, वैश्विक आदेश आदेश निष्पादित करता है:
let c+=1 | s//\=c.'. '
यह चर वृद्धि कर देता है c
( let c+=1
), तो ( |
) यह विकल्प ( s
) पिछले पैटर्न (खोजा गया //
एक अभिव्यक्ति (के मूल्यांकन के साथ) \=
):
चर की सामग्री को c
श्रेणीबद्ध ( .
) स्ट्रिंग के साथ'. '
यदि आप अपने बफर से सभी लाइनों को संशोधित नहीं करना चाहते हैं, लेकिन केवल एक विशिष्ट पैराग्राफ, आप वैश्विक कमांड के लिए एक सीमा पारित कर सकते हैं। उदाहरण के लिए, केवल उन पंक्तियों को संशोधित करने के लिए जिनकी संख्या 5 और 10 के बीच है:
:let c=0 | 5,10g/^* /let c+=1 | s//\=c.'. '
यदि आपके पास कई समान सूचियों वाली फ़ाइल है, जिसे आप कनवर्ट करना चाहते हैं, उदाहरण के लिए कुछ इस तरह से:
some random stuff some random stuff
* foo 1. foo
* bar 2. bar
* baz 3. baz
some other random stuff some other random stuff
==>
some random stuff some random stuff
* foo 1. foo
* bar 2. bar
* baz 3. baz
* qux 4. qux
some other random stuff some other random stuff
आप इसे निम्न आदेश के साथ कर सकते हैं:
:let [c,d]=[0,0] | g/^* /let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')] | s//\=c.'. '
यह पिछली कमांड का केवल एक संस्करण है, जो c
किसी अन्य सूची में जाने पर चर को रीसेट करता है । यह पता लगाने के लिए कि क्या आप किसी अन्य सूची में हैं, चर d
का उपयोग अंतिम पंक्ति की संख्या को संग्रहीत करने के लिए किया जाता है जहां एक प्रतिस्थापन बनाया गया था।
वैश्विक कमांड वर्तमान लाइन संख्या ( line('.')
) की तुलना करता है d+1
। यदि वे समान हैं, तो इसका मतलब है कि हम एक ही सूची में हैं क्योंकि इससे पहले c
कि वेतन वृद्धि ( c+1
) है, अन्यथा इसका मतलब है कि हम एक अलग सूची में हैं, इसलिए c
रीसेट ( 1
) है।
किसी फ़ंक्शन के अंदर, कमांड let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')]
को इस तरह से फिर से लिखा जा सकता है:
let c = line('.') == d+1 ? c+1 : 1
let d = line('.')
या इस तरह:
if line('.') == d+1
let c = c+1
else
let c = 1
endif
let d = line('.')
कुछ कीस्ट्रोक्स को बचाने के लिए, आप कस्टम कमांड को भी परिभाषित कर सकते हैं :NumberedLists
, जो एक सीमा को स्वीकार करता है जिसका डिफ़ॉल्ट मान है 1,$
( -range=%
):
command! -range=% NumberedLists let [c,d]=[0,0] | <line1>,<line2>g/^* /let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')] | s//\=c.'. '
जब :NumberedLists
निष्पादित किया जाएगा, <line1>
और <line2>
आपके द्वारा उपयोग की जाने वाली सीमा के साथ स्वचालित रूप से बदल दिया जाएगा।
इसलिए, सभी सूचियों को बफर में बदलने के लिए, आप टाइप करेंगे: :NumberedLists
केवल रेखा 10 और 20 के बीच की सूची: :10,20NumberedLists
केवल दृश्य चयन: :'<,'>NumberedLists
अधिक जानकारी के लिए देखें:
:help :range
:help :global
:help :substitute
:help sub-replace-expression
:help list-identity (section list unpack)
:help expr1
:help :command