search विम में एके के साथ खोज और प्रतिस्थापन कैसे करें?




vim replace (4)

अब, विम में यह नया कमांड cdo जो दिए गए कमांड को क्विकफिक्स सूची की प्रत्येक पंक्ति में चलाएगा।

तो आप इसका उपयोग कर सकते हैं

:Ack pattern
:cdo s/pattern/newpattern/g

मैं विम में एक प्लगइन का उपयोग कर रहा हूं, जो मुझे मेरी परियोजना में तारों की त्वरित खोज करने में मदद करता है। हालांकि, कभी-कभी मैं पाए गए तारों की सभी या कुछ घटनाओं को प्रतिस्थापित करना चाहता हूं। आप किसी प्रकार की वैश्विक खोज कर सकते हैं और इस तरह ( source ) जैसे विम आर्किस्टिस्ट का उपयोग कर प्रतिस्थापित कर सकते हैं:

:args app/views/*/*
:argdo %s/, :expire.*)/)/ge | update

लेकिन args का उपयोग करने के बजाय, मैं एके के माध्यम से एक खोज करना पसंद करूंगा और फिर उन सभी फ़ाइलों में प्रतिस्थापित करूँगा जो पाए गए हैं। क्या argdo कमांड के समान ऐसा करने का कोई तरीका है?


मुझे विश्वास नहीं है कि ऐसा करने के तरीके में बनाया गया है, लेकिन इसे बनाना आसान होना चाहिए।

आपको जो करना है वह एक कमांड बनाना है जो कस्टम फ़ंक्शन को कॉल करता है। फ़ंक्शन को Quickfix सूची में सभी प्रविष्टियों को प्राप्त करने के लिए getqflist() फ़ंक्शन का उपयोग करना चाहिए और गंदे काम करने के लिए exe करना चाहिए। सावधान रहें कि आप एक तर्क के रूप में क्या पास करते हैं!

" Define a command to make it easier to use
command! -nargs=+ QFDo call QFDo(<q-args>)

" Function that does the work
function! QFDo(command)
    " Create a dictionary so that we can
    " get the list of buffers rather than the
    " list of lines in buffers (easy way
    " to get unique entries)
    let buffer_numbers = {}
    " For each entry, use the buffer number as 
    " a dictionary key (won't get repeats)
    for fixlist_entry in getqflist()
        let buffer_numbers[fixlist_entry['bufnr']] = 1
    endfor
    " Make it into a list as it seems cleaner
    let buffer_number_list = keys(buffer_numbers)

    " For each buffer
    for num in buffer_number_list
        " Select the buffer
        exe 'buffer' num
        " Run the command that's passed as an argument
        exe a:command
        " Save if necessary
        update
    endfor
endfunction

मैंने विम के बाहर इस समस्या को हल करने के लिए एएके और पर्ल का उपयोग करने का निर्णय लिया है, इसलिए मैं जीएनयू सबसेट के बजाय अधिक शक्तिशाली पर्ल नियमित अभिव्यक्तियों का उपयोग कर सकता हूं। आप इसे अपने vimrc में एक महत्वपूर्ण स्ट्रोक पर मैप कर सकते हैं।

ack -l 'pattern' | xargs perl -pi -E 's/pattern/replacement/g'

व्याख्या

एसीके

एक एक कमाल कमांड लाइन उपकरण है जो grep , find , और पूर्ण पर्ल नियमित अभिव्यक्ति का मिश्रण है (न केवल जीएनयू सबसेट)। यह शुद्ध पर्ल में लिखा गया है, यह तेज़ है, इसमें मिलान हाइलाइटिंग है, विंडोज़ पर काम करता है और परंपरागत कमांड लाइन टूल्स की तुलना में प्रोग्रामर के लिए यह मित्रवत है। उबंटू पर इसे sudo apt-get install ack-grep

xargs

Xargs एक पुराना यूनिक्स कमांड लाइन उपकरण है। यह मानक इनपुट से आइटम पढ़ता है और मानक इनपुट के लिए पढ़ी गई वस्तुओं के बाद निर्दिष्ट आदेश निष्पादित करता है। तो मूल रूप से एएके द्वारा उत्पन्न फ़ाइलों की सूची perl -pi -E 's/pattern/replacemnt/g' कमांड के अंत में संलग्न की जा रही है।

perl -pi

पर्ल एक प्रोग्रामिंग भाषा है। -p विकल्प पर्ल को आपके प्रोग्राम के चारों ओर एक लूप बनाने का कारण बनता है जो फ़ाइल नाम तर्कों पर पुनरावृत्त करता है। -i विकल्प पर्ल को फ़ाइल को संपादित करने का कारण बनता है। आप बैकअप बनाने के लिए इसे संशोधित कर सकते हैं। -ई विकल्प पर्ल को प्रोग्राम के रूप में निर्दिष्ट कोड की एक पंक्ति निष्पादित करने का कारण बनता है। हमारे मामले में कार्यक्रम सिर्फ एक पर्ल रेगेक्स प्रतिस्थापन है। पर्ल कमांड लाइन विकल्प perldoc perlrun पर अधिक जानकारी के लिए। पर्ल पर अधिक जानकारी के लिए http://www.perl.org/ देखें।


आप इस तरह से एक का उपयोग कर सकते हैं

:args `ack -l User app/`
:argdo %s/, :expire.*)/)/ge | update

या एजी का प्रयोग करें

:args `ag -l User app/`
:argdo %s/, :expire.*)/)/gec | w




ack