लाइन संदर्भ अंतर को समझना: g / ^ / मानदंड और के माध्यम से:% मानदंड


8

मान लीजिए कि मेरे पास बहुत सरल फ़ाइल है

a
b
c
d
e

और मैंने तय किया है कि मैं प्रत्येक पंक्ति के बाद खाली लाइनें जोड़ना चाहता हूं। कई अलग-अलग तरीके तुरंत मेरे दिमाग में आते हैं। हम बस यह कर सकते हैं (और इस तरह विफलता को गले लगाओ)। हम एक मैक्रो को रिकॉर्ड कर सकते हैं qqo<ESC>jqऔर इसे कई बार दोहरा सकते हैं।

उस समय मेरे लिए दो अन्य तरीके स्पष्ट थे।

सबसे पहले, मैंने सोचा था कि मैं प्रत्येक पंक्ति पर :normकमांड जारी करूंगा o। तो मैं दौड़ता हूं :%norm o। लेकिन वास्तव में क्या होता है कि हमें 5 रिक्त रेखाएं मिलती हैं, इसके बाद ऊपर-अलग-अलग लाइनों को अलग किया जाता है। मैं इसका मतलब यह है कि %normवास्तव में, इस पांच लाइन फ़ाइल के पहले पांच लाइनों पर निम्नलिखित सामान्य आदेश संदेश मुद्दा उठाता है मतलब है । oआदेश एक नई लाइन बनाता है और vim "गूंगा" इस अर्थ में कि यह कुछ अन्य पहचानकर्ता द्वारा वास्तव में नहीं लाइन संख्या से संदर्भित करती और में है।

खैर, मैं शर्मिंदा था। ज़रूर। मैंने यह देखने के लिए कुछ अन्य चीजों की कोशिश की कि क्या मैं उपरोक्त विधि काम कर सकता हूं, लेकिन अफसोस, मैं नहीं कर सका। जिज्ञासा से बाहर, मैंने अपने अन्य पसंदीदा द्रव्यमान-आवेदन विधि की कोशिश की। इसके चलते मैंने कोशिश की :g/^/norm o। मेरे आश्चर्य करने के लिए, यह ठीक काम करता है! तो मेरी नज़र में, ऐसा लगता है कि vim यहाँ "dumb" नहीं है, ठीक उसी तरह जैसे कि ऊपर और बस लाइनों की संख्या से अधिक है।

वास्तव में क्या चल रहा है?


2
एक साइड नोट पर: आप इसे इस तरह भी कर सकते हैं: :%s/$/\r/या इस तरह :%s/\n/\r\r/:। Takeaway है कि newlines के साथ मिलान किया जा सकता है \n, लेकिन \rप्रतिस्थापन मूल्यों के रूप में लिखा जाना है ।
lcd047

जवाबों:


9

खैर, के %लिए आशुलिपि 1,$(पहली पंक्ति से आखिरी तक एक सीमा) है। से :he :%:

Line numbers may be specified with:             :range E14 {address}
        {number}        an absolute line number
        .               the current line                          :.
        $               the last line in the file                 :$
        %               equal to 1,$ (the entire file)            :%

और इसके लिए :global:

The global commands work by first scanning through the [range] lines and
marking each line where a match occurs (for a multi-line pattern, only the
start of the match matters).
In a second scan the [cmd] is executed for each marked line with its line
number prepended.  For ":v" and ":g!" the command is executed for each not
marked line.  If a line is deleted its mark disappears.

तो, पहला मामला इसे संशोधित करते समय सूची को ट्रेस करने जैसा है, इसलिए सूची तत्वों पर एक काउंटर अमान्य हो जाता है। दूसरे मामले में, हम उन तत्वों को चिह्नित करते हैं जिन्हें हम एक पास में लक्षित करना चाहते हैं, ताकि भले ही सूची को दूसरे पास में संशोधित किया जाए, फिर भी हम जानते हैं कि हम किन तत्वों पर काम करना चाहते हैं।


आह, यह वैश्विक के लिए मदद फ़ाइल में भी है। मैं कितना मूर्ख हूं। धन्यवाद
davidlowryduda

आदमी - g ओवरकिल पागल उपयोगी है। मैं औसत उपयोगकर्ता से बिजली उपयोगकर्ता तक जाने के लिए अधिक समय व्यतीत करता
हूं
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.