विम में मामूली अंतर के साथ दोहराव वाला टेक्स्ट कैसे डालें?


11

मैं इस तरह से पाठ सम्मिलित करना चाहता हूं:

similar text wordA similar text ...
similar text wordB similar text ...
similar text wordC similar text ...

मुझे पता है कि मैं पाठ को कई बार पेस्ट कर सकता हूं, फिर प्रत्येक पंक्ति के लिए एकल शब्द को बदलने के लिए प्रतिस्थापन का उपयोग कर सकता हूं, हालांकि मुझे अभी भी यह विधि बहुत असुविधाजनक लगती है।

क्या किसी शब्द या शब्द सूची को "वैरिएबल" में सहेजने का कोई तरीका है तो इसी तरह के पाठ को उत्पन्न करने के लिए इस चर का उपयोग करें?


संपादित करें मैंने मूल प्रश्न में कुछ स्पष्ट किया है, वास्तव में मैं कुछ बहुत ही समान फ़ंक्शन परिभाषा बनाने की कोशिश कर रहा हूं, इसलिए wordA wordB... पाठ के प्रत्येक क्लोन में कई बार दिखाई दे सकता है और पाठ में कई लाइनें हो सकती हैं। पैटर्न बिल्कुल इस तरह है:

similar_text1 wordA similar_text2 wordA similar_text3 ...
similar_text1 wordB similar_text2 wordB similar_text3 ...
similar_text1 wordC similar_text2 wordC similar_text3 ...

(पाठ में नई लाइनें हो सकती हैं, और वर्डए, वर्डबी ... कई बार मौजूद हो सकता है)


दूसरा EDIT "समान_टेक्स्ट" भाग शायद हर बार जब मैं इस तरह का काम करता हूं, तो इस नौकरी के लिए समाधान बेहतर होगा। क्योंकि मैं बहुत समान कार्य परिभाषाएँ बनाने की कोशिश कर रहा हूं, या मैपिंग टेबल को कार्य करने के लिए एक स्ट्रिंग।

उत्तर और कुछ अभ्यास को पढ़ने के बाद, मुझे लगता है कि इस नौकरी को किसी प्रकार के प्रतिस्थापन के रूप में सोचना अधिक सुविधाजनक है, क्योंकि अलग-अलग "part1", "part2" ... "partN" जिसमें newlines शामिल हो सकते हैं, लिखना कठिन है, इसलिए लिखें पहले एक टेम्पलेट:

similar_text1 $WORD similar_text2 $WORD similar_text3 ...
(text may contain <ENTER>, make sure $WORD not exist in "similar_text" parts )

फिर पाठ के क्लोन डालने की कोशिश की जा रही है लेकिन शब्दों की सूची के साथ $ WORD की जगह अधिक सीधी सोच है।

तो ऐसा लगता है कि मेरी समस्या बदल गई है "किसी पाठ खंड को कई बार कैसे क्लोन किया जाए, लेकिन हर बार सूची से एक शब्द के साथ एक कीवर्ड को प्रतिस्थापित करके?"


यही कारण है कि रजिस्टरों के लिए उपयोग किया जाता है। आप एक रजिस्टर में टेक्स्ट को कॉपी (कॉपी) कर सकते हैं और फिर उस रजिस्टर का उपयोग कर सकते हैं। मैक्रोज़ का उपयोग समान कार्यों के साथ-साथ दोहराए जाने वाले कार्यों के लिए भी किया जा सकता है।
सिबिकोडर

जवाबों:


7

आप निम्न फ़ंक्शन का उपयोग कर सकते हैं:

function! GenerateLines()
    let firstpart="similar text part 1"
    let secondpart="similar text part 2"

    let words=["wordA","wordB","wordC","wordD","wordE"]

    for word in words
        let line = firstpart . word . secondpart
        call append(line('.')+1, line)
        normal j
    endfor
endfunction

चरों में firstpartऔर secondpartशब्दों के पहले और बाद में दोहराने के लिए पाठ डालें और सूची में wordsउन शब्दों को डालें जिन्हें बदलना चाहिए।

फिर लूप सूची के प्रत्येक शब्द के लिए लाइन की सामग्री बनाएगा, बफर में लाइन डालें और इस नई लाइन पर जाएं।

फिर आप केवल फ़ंक्शन को कॉल कर सकते हैं call GenerateLines():।


संपादित करना आसान बनाने के लिए आप विभिन्न भागों को भी तर्क के रूप में पारित कर सकते हैं, फ़ंक्शन को इस तरह दिखना चाहिए:

function! GenerateLines(firstpart, secondpart, words)
    for word in a:words
        call append(line('.')+1, a:firstpart . word . a:secondpart)
        normal j
    endfor
endfunction

और आप इसे इस तरह कह सकते हैं:

call GenerateLines("first part", "second part", ["wordA","wordB","wordC","wordD","wordE"])

आप के साथ call map(a:words, 'a:firstpart . v:val . a:secondpart')और पाश से बच सकते हैं call append(line('.'), a:words)
एंटनी

चूंकि मैं अक्सर बहुत लंबे "फर्स्टपार्ट" और "सेकंडपार्ट", यहां तक ​​कि "थर्डपार्ट" के साथ इस तरह के एडिट करता हूं, और इन हिस्सों में न्यूलाइन्स हो सकते हैं, यह कमांड मोड में इतना टाइप करने के लिए बहुत लंबा लगता है, इसलिए शायद यह अधिक आश्वस्त है पाठ को पंजीकृत करने के लिए, तो रजिस्टर से पाठ उत्पन्न करने के लिए कार्यों का उपयोग करें?
सामाजिक_लोगर

मैंने प्रश्न संपादित किया, यह बहुत बदल जाता है, असुविधा के लिए खेद है।
social_loser

5

ऐसे मामलों में मेरी रणनीति अलग-अलग होगी, लेकिन यह अक्सर निम्न चरणों का पालन करती है:

  1. अद्वितीय शब्द लिखें

    wordA
    wordB
    ...
    wordK
    
  2. भी

    क) एक खोज करते हैं और प्रतिस्थापित करते हैं, जैसे

    :%s/\w\+/similar text \0 similar text .../
    

    बी) या दृश्य ब्लॉक मोड का उपयोग करें, देखें :h blockwise-visual। विशेष रूप से, मैं शब्दों का चयन करता हूं और Iसामने वाले पाठ को सम्मिलित करने के लिए उपयोग करता हूं , या इसके Aबाद समान पाठ को जोड़ने के लिए उपयोग करता हूं ।

मेरा तर्क है कि जब आप इस तरह के संपादन कार्य अपेक्षाकृत कम करते हैं तो यह रणनीति समझ में आती है। हालांकि, अगर आपको लगता है कि आपको अक्सर ऐसा करने की आवश्यकता है, तो आपको एक समारोह के साथ @ स्टेटॉक्स के सुझाव का पालन करना चाहिए जो शब्दों की सूची का विस्तार करता है।


मुझे लगता है कि समाधान इस बात पर निर्भर करता है कि शब्द सूची कहां से आ रही है। यदि यह एक फ़ाइल से है, तो :readआपके प्रतिस्थापन के बाद बहुत मायने रखता है।
एंटनी

आपका समाधान करना आसान है और मूल प्रश्न में पूछे गए प्रश्न को आसानी से हल कर सकते हैं। हालाँकि मेरी मूल पोस्ट में कुछ गलतियाँ हैं, मैंने 2 संपादन किए और यह बहुत बदल गया, उत्तर के लिए धन्यवाद, मेरी बदलती और बुरी अंग्रेजी के लिए खेद है :)
social_loser

@ social_loser आप प्रतिस्थापन के प्रतिस्थापन भाग में एक नई रेखा के लिए खड़े होने के लिए "\ r" का उपयोग करके इस समाधान को अनुकूलित कर सकते हैं
frangio

2

मैं तर्क दूंगा कि यह विजुअल ब्लॉक ( Ctrl+ v) के लिए एक काम है । पहले मैं सभी विशिष्ट शब्द लिखूंगा:

wordA
wordB
wordC
wordD
wordE

पहले wमैं फिर प्रदर्शन करूँगा कर्सर के साथ शुरू :

<c-v>5j$yA <esc>pA <esc>p

मैं A <esc>pजितनी बार चाहे दबाकर कितने कॉलमों को नियंत्रित कर सकता हूं। चलिए मान लेते हैं कि मुझे ऊपर के कमांड की तरह तीन कॉलम की जरूरत थी। अब हमारे पास यह है:

wordA wordA wordA
wordB wordB wordB
wordC wordC wordC
wordD wordD wordD
wordE wordE wordE

और कर्सर wordAपहली पंक्ति में 3rd की शुरुआत में है । आगे मैं पीछे जाने वाले स्तंभों और बीच में पाठ जोड़ने के बीच व्हाट्सएप के कॉलम को चुनूंगा। वर्तमान कर्सर स्थान से:

h<c-v>5jI similar text 3<esc>

यह परिणाम (% कर्सर स्थिति को चिह्नित करता है):

wordA wordA%similar text 3 wordA
wordB wordB similar text 3 wordB
wordC wordC similar text 3 wordC
wordD wordD similar text 3 wordD
wordE wordE similar text 3 wordE

अगले कॉलम के लिए दोहराएं:

bh<c-v>5jI similar text 2<esc>

और अंतिम / पहला (बाईं ओर वाला) कॉलम:

b<c-v>5jIsimilar text 1 <esc>

अंत में परिणाम:

similar text 1 wordA similar text 2 wordA similar text 3 wordA
similar text 1 wordB similar text 2 wordB similar text 3 wordB
similar text 1 wordC similar text 2 wordC similar text 3 wordC
similar text 1 wordD similar text 2 wordD similar text 3 wordD
similar text 1 wordE similar text 2 wordE similar text 3 wordE

अद्यतन: एक स्क्रीनकास्ट जोड़ा गया

यहाँ छवि विवरण दर्ज करें


यह बहुत टाइपिंग प्रतीत होता है लेकिन वास्तव में इसका उपयोग करना बहुत आसान है। यह आपको शब्दों की संख्या, कॉलम की संख्या और यहां तक ​​कि कॉलम के बीच रिक्ति को बदलने की स्वतंत्रता प्रदान करता है।

दोष यह है कि आपको अपने द्वारा उपयोग किए जा रहे विभिन्न शब्दों की संख्या जानने की आवश्यकता है । मेरे पास 5उपरोक्त सभी कमांड में हार्डकोड है क्योंकि यह उन पंक्तियों की संख्या है जिन पर कमांड चल रही हैं।

नोट डीबग करना: सभी कमांड सामान्य मोड में शुरू और समाप्त होते हैं, यदि आप अपने आप को किसी कमांड के अंत में विजुअल या इन्सर्ट मोड में पाते हैं तो आप कुछ गलत कर रहे हैं।

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