2012-05-04 15 views
5

मैं एकाधिक फ़ाइलों के लिए निम्नलिखित विम का उपयोग कर क्या करना चाहते हैं: कुछ पाठ विम: एकाधिक फ़ाइलें के लिए: सभी पाठ की प्रतिलिपि बनाएँ, बदलें और पेस्ट करें

  • पेस्ट

    1. कॉपी प्रत्येक फ़ाइल
    2. में सभी पाठ बदलें प्रत्येक फ़ाइल
    3. के अंत में प्रतिलिपि बनाए गए पाठ कुछ अन्य पाठ

    यहाँ एक फ़ाइल के लिए मेरे आदेशों हैं बदलें:

    :%y 
    :%s/old1/new1/g 
    :G 
    :P 
    :%s/old2/new2/g 
    

    क्या कोई मुझे ऐसा करने के लिए वाक्यविन्यास बता सकता है? खासकर कि मैं विम के लिए नया हूँ!

    मुझे पता चला कि argdo एकाधिक फ़ाइलों पर कमांड निष्पादित कर सकता है। मुझे टेक्स्ट बदलने में Argdo का उपयोग करने के लिए कई उदाहरण मिले, लेकिन मुझे argdo का उपयोग करने के लिए वाक्यविन्यास नहीं मिला:% y,: जी, या: पी

    धन्यवाद।

  • उत्तर

    4

    @ib की तरह उल्लेख किया है, मैं पूर्व के साथ ऐसा होता आदेशों

    :argdo %y | %s/old1/new1/g | $pu | %s/old2/new2/g 
    

    वहाँ भी एक अच्छा मौका है कि आप अनन्य सीमाओं पर संचालित करने के लिए चाहते हो सकता है (केवल पहली पर पहले प्रतिस्थापन करते हैं हिस्सा है, और केवल दूसरे पर दूसरा):

    :argdo $mark a | %co$ | 1,'a s/old1/new1/g | 'a,$s/old2/new2/g 
    

    , न खाने वाले प्रतिस्थापन की अनुमति देने के s///e जोड़ सकते हैं और आपरेशन बहुत तेजी से कई फाइलों के मामले में बनाने के लिए silent! को जोड़ने के लिए।

    :silent! argdo $mark a | %co$ | 1,'a s/old1/new1/ge | 'a,$s/old2/new2/ge 
    

    (ध्यान दें कि argdo डिफ़ॉल्ट रूप से एक पूर्व आदेश सूची की उम्मीद है। आप सामान्य मोड का उपयोग करने के argdo norm! ggyG प्रयोग करेंगे जैसे आदेशों)

    +0

    को पुनरारंभ किए बिना तर्क सूची सेट करने के लिए 'myfile? .txt arg का उपयोग करें' का उपयोग करें! यह काम कर रहा है मैंने अभी जोड़ा है w | 1 कमांड : argdo% y | % s/old1/new1/g | $ पु | % s/old2/new2/g | डब्ल्यू – Pansy

    +1

    @ पैन्सी। ये सही है। अच्छा निर्णय। मेरे पास हमेशा 'ऑटो से ऑटोटाइड' सक्षम है (मेरे पास लगातार पूर्ववत और बाकी के लिए संस्करण नियंत्रण है) – sehe

    +1

    केवल दो पाठों में से प्रत्येक को मूल पाठ की एक प्रति पर चलाने की आवश्यकता के मामले में, कोई एक चिह्न सेट करने से बच सकता है मैन्युअल रूप से: ': argdo% y |% s/o1/n1/g | $ pu | '[, $ s/o2/n2/g'। –

    3

    यूपीडी: मेरा विम-फू @ ib या @ sehe के रूप में उतना मजबूत नहीं है, इसलिए आप मेरे बजाय सुझाए गए समाधानों का उपयोग करना चाहेंगे।

    लेकिन, मेरा समाधान संपादित करना और मेरे लिए व्यक्तिगत रूप से डीबग करना आसान है (एक विम प्रशिक्षु के रूप में), तो, इसे वैसे भी यहां रहने दें।


    आप में निम्नलिखित अस्थायी समारोह में जोड़ सकते हैं अपने vimrc:

    function! MyTmpFunc() 
        :%y 
        :%s/old1/new1/g 
        normal! G 
        normal! P 
        :%s/old2/new2/g 
    endfunction 
    

    फिर फ़ाइलों को आप (vim myfile1.txt myfile2.txt myfile3.txt की तरह कुछ) को प्रभावित करने की जरूरत के साथ विम पुनरारंभ करें, और निम्न आदेश निष्पादित करें:

    :argdo call MyTmpFunc()

    यही आपके प्रश्न में वर्णित है: फ़ंक्शन MyTmpFunc() डब्ल्यू विम को दिए गए प्रत्येक तर्क के लिए बीमार कहा जाता है।

    अब आप vimrc से MyTmpFunc() हटा सकते हैं।

    :bufdo से भी अवगत रहें - यह प्रत्येक खुले बफर के लिए कुछ आदेश कहता है। :windo भी है, जो प्रत्येक विंडो के लिए कमांड निष्पादित करता है, लेकिन व्यक्तिगत रूप से मुझे :bufdo सबसे उपयोगी लगता है।

    कृपया ध्यान दें कि यदि आपको प्रत्येक बफर में केवल एक ही आदेश निष्पादित करने की आवश्यकता है तो आपको अस्थायी फ़ंक्शन बनाने की आवश्यकता नहीं है। कहो, यदि आप "old1" से "new1" प्रत्येक बफर में बदलने के लिए बस की जरूरत है, तो आप निम्न आदेश पर अमल कर सकते हैं:

    :bufdo %s/old1/new1/g

    और बस इतना ही।

    +4

    एक अस्थायी समारोह बनाने के लिए नहीं है कई पूर्व आदेशों को निष्पादित करने के लिए: 'argdo% y |% s/o1/n1/g | $ pu |% s/o2/n2/g'। –

    +0

    @ib हमेशा ib के रूप में, यह एक उत्तर होने के लायक है। मैंने अपने – sehe

    +0

    @ib में कुछ और विचार जोड़े। हाँ, मेरा विम-फु इतना मजबूत नहीं है, मेरा बुरा। लेकिन, जिस तरह से मैंने सुझाव दिया है वह संपादित करना और मेरे लिए व्यक्तिगत रूप से डीबग करना आसान है (एक विम प्रशिक्षु के रूप में), तो, इसे वैसे भी यहां रहने दें। (मैंने अपना जवाब भी अपडेट किया) –

    संबंधित मुद्दे