विम: किसी लाइन पर पहले N <g घटनाओं को प्रतिस्थापित करता है


13

विम में, मुझे कभी-कभी एक लाइन पर मैच के पहले कुछ घटनाओं को बदलने का अवसर मिलता है, लेकिन हर एक को पसंद नहीं gहोगा। उदाहरण के लिए:

a a a a a

सेवा

b b b a a

मुझे पता है कि मैं उपयोग कर सकता हूं :s/a/b/[enter]:[up][enter]:[up][enter], लेकिन यह तीन पुनरावृत्तियों में पर्याप्त थकाऊ है, मेरे पास संभावित 10+ प्रतिस्थापन के साथ लाइनें हैं।
मैंने कोशिश की:

  • :s/a/b/3g: विम ने अनुगामी पात्रों की शिकायत की।
  • :s/a/b/3: इस और पहली दो पंक्तियों पर पहली घटना को बदलता है।
  • 3:s/a/b: पहले जैसा।
  • :s/a/b/g3: इस और अगली दो पंक्तियों पर सभी घटनाओं को बदलता है।
  • :3s/a/b: लाइन 3 पर पहली घटना को बदलता है।
  • :/a/,3/a/s/a/b: फ़ाइल में अगली aऔर तीसरी पंक्ति के बीच प्रत्येक पंक्ति पर पहली बार होने वाली परिवर्तन a(यदि आवश्यक हो तो रिवर्स करने के लिए संकेत)।
  • :/a/,/\([^a]*a\)\{3\}/s/a/b/: इस और इसके बीच के 3 as के साथ प्रत्येक पंक्ति पर पहली घटना को बदलता है (और यह आसानी से एक बहु-चरित्र खोज के लिए एक्स्टेंसिबल नहीं होगा)।

और विभिन्न अन्य संबोधित करने वाले पैटर्न, जिनमें से कोई भी काम नहीं किया। मुझे कहना होगा, मैंने :sइस समस्या का उत्तर खोजने की कोशिश कर रहे कमांड के बारे में एक उचित राशि सीखी है, लेकिन मैंने अभी भी इसे हल नहीं किया है।

क्या कोई जानता है कि इसे कैसे करना है?

(विशिष्ट सीमाओं के लिए बोनस अंक, उदाहरण के लिए चौथी घटनाओं के माध्यम से दूसरा)


2
मुझे पूरा यकीन है कि आप ऐसा नहीं कर सकते हैं, लेकिन इसे कम थकाऊ बनाने के लिए, क्या आप "एन" और "के बारे में जानते हैं।" दृश्य विधा में? यही है, आप बदलने के लिए चीज़ को खोजने के लिए / पैटर्न / का उपयोग करते हैं, इसे "cw" या जो भी हो, को बदलने के लिए "n" (बस n, कोई उद्धरण नहीं) का उपयोग करके अगले पैटर्न को खोजें और हिट करें। (सिर्फ अवधि, कोई उद्धरण) अंतिम संपादन करने के लिए।
ब्रूस एडगर

@BruceEdiger के बारे में मुझे पता था nऔर ., हालांकि मैंने उन्हें यहाँ इस्तेमाल करने के लिए नहीं सोचा था। निश्चित रूप से एक सुधार, धन्यवाद।
केविन

s/a/=something/चाल ( :help sub-replace-=) करना चाहिए । मैं somethingबल्ले से सही लिखने के लिए विम में काफी धाराप्रवाह नहीं हूं ।
गाइल्स का SO- बुराई होना बंद करो '

नोट: के :[up][enter]साथ प्रतिस्थापित किया जा सकता है &, जो अभी भी आदर्श नहीं है, लेकिन कम से कम कम दर्दनाक है।
कोव

जवाबों:


10

:s/pattern/replacement/gc Samus_ के विचार पर निर्माण (जो कि पैटर्न को प्रतिस्थापन स्ट्रिंग के भीतर समाहित करने के लिए सही संचालन सुनिश्चित करने का सबसे सरल तरीका लगता है), 2 को प्रतिस्थापित करने के लिए एक एकल पंक्ति पर 4 घटनाओं के माध्यम से:

:call feedkeys("nyyyq") | s/pat/string/gc

feedkeys()एक फंक्शन है जो कीबोर्ड इनपुट कतार में इनपुट स्ट्रिंग को भरता है। बात यह है कि काउंटिंग अपफ्रंट से करें ताकि आपको गिनती खोने या बाधित होने की चिंता न हो।

एक अधिक सामान्य मामले के लिए, को बदलने के लिए महीना के माध्यम से वां लिए एक पंक्ति पर घटनाओं एन एक बहुत बड़ी करने के लिए बराबर या उससे अधिक एम :

:call feedkeys(repeat("n", M-1) . repeat("y", N-M+1) . "q") | s/pat/string/gc

M और N को उन मानों से बदलें, जिन्हें आप चाहते हैं ( vimयदि आप स्वयं नहीं करना चाहते हैं तो आप तुच्छ मानसिक अंकगणित भी कर सकते हैं )। ध्यान दें कि .VimL का स्ट्रिंग कॉन्सेप्टेशन ऑपरेटर है। जाहिर है यह केवल बड़े एम के लिए कीस्ट्रोक्स बचाता है । यदि आप बार-बार इस कार्यक्षमता का उपयोग करते हैं, तो यह आपको कस्टम कमांड या फ़ंक्शन को किसी प्रकार से ऊपर रखने के लिए समय बचा सकता है, क्योंकि यह टाइप करने के लिए काफी थोड़ा है।


हम्म। मैं यह पसंद है। मुझे इसके लिए एक फ़ंक्शन लिखने में सक्षम होना चाहिए।
केविन

8

पहले प्रश्न के लिए मैं करूँगा:

:s/a/b
&&

दूसरा मुश्किल है, मैं इसे स्वचालित रूप से करने का एक तरीका नहीं जानता, लेकिन आप इस तरह से प्रत्येक मैच पर आपको संकेत दे सकते हैं:

:s/a/b/gc

फिर आप पहले n मैचों के लिए "नहीं" और दूसरों को "हां" का जवाब देते हैं।


हम्म, मैं के बारे में भूल गया c, कि अभी तक प्रस्तावित सबसे अच्छा समाधान हो सकता है। मुझे अभी भी गिनना होगा, लेकिन मुझे लगता है कि यह पहला विकल्प है जो प्रतिस्थापन के साथ काम करेगा जिसमें खोज स्ट्रिंग शामिल है।
केविन

6
a a a a a
a a a a a
a a a a a
a a a a a
a a a a a
a a a a a
a a a a a

:3,6g/^/let i=0 | while i<3 | s/a/b/ | let i+=1 | endwhile

a a a a a
a a a a a
b b b a a
b b b a a
b b b a a
b b b a a
a a a a a

1
यह अच्छा है, लेकिन यह अभी भी समस्या से ग्रस्त है गिल्स ने बताया (एक और पोस्ट पर, जिसे तब से हटा दिया गया लगता है), कि यह केवल तभी काम करता है जब प्रतिस्थापन में पैटर्न नहीं होता है। हालांकि मुझे स्क्रिप्टिंग आइडिया पसंद है।
केविन

सुंदरता की बात!
बिशप

1

मुझे लगता है कि यह काम कर सकता है, पहले बदलें, फिर 2 बार दोहराएं:

:s/a/b/
2@:
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.