2013-03-07 5 views
6

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

function! FindAndReplaceAll(from, to)           
    echo a:from                 
    :%s/a:from/a:to/gc                
    endfunction 

जब मैं कार्य करें:

:call FindAndReplaceAll("test", "test2") 

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

मेरे प्रश्न हैं:

  1. क्या इस के साथ सही सिंटैक्स है? मैं सिर्फ जवाब के बजाय क्यों एक स्पष्टीकरण की सराहना करता हूं। उपरोक्त गलत क्यों है?
  2. वैसे भी इस बात के लिए अनुमति देने के लिए

    के रूप में बुलाया जाना चाहिए: फोन FindAndReplaceAll (परीक्षण, test2)

तो मैं उद्धरण जोड़ने के लिए नहीं है ...

उत्तर

12

आप बदल

0 की जरूरत है: लाइन `निष्पादित ', प्रत्यक्ष पाठ के बजाय साथ बुलाया जाना चाहिए

:%s/a:from/a:to/gc

रहे हैं:

exe '%s/' . a:from . '/' . a:to . '/gc'

अपने बयान सचमुच व्याख्या की है। यानी यह वर्तमान बफर में स्ट्रिंग "ए: टू" स्ट्रिंग "ए: से" स्ट्रिंग को प्रतिस्थापित करेगा।

लेकिन द्वारा मूल्यांकन किए गए स्ट्रिंग के साथ a:from द्वारा मूल्यांकन की गई स्ट्रिंग को प्रतिस्थापित करने का इरादा आप क्या चाहते हैं। इसे exe[cute] फ़ंक्शन में निर्मित किया जा सकता है (आप टाइप करके सहायता प्राप्त कर सकते हैं: :h exe कमांड लाइन मोड में)।

आपके दूसरे प्रश्न के लिए, आपको उद्धरणों का उपयोग करना होगा अन्यथा उन्हें चर के रूप में लिया जाएगा।

1

आदेश

function! FindAndReplaceAll(from, to)           
    echo a:from                 
    execute "%s/" . a:from . "/" . a:to . "/gc"                
endfunction