विम खोज वर्तमान (प्रोजेक्ट) फ़ोल्डर में सभी फ़ाइलों को प्रतिस्थापित करती है


36

विम के बारे में मेरे द्वारा पूछे गए खुले सवालों में से एक यह है कि क्या वर्तमान प्रोजेक्ट में खोज / प्रतिस्थापन करने का कोई तरीका है (यदि मेरे साथ अन्य संपादकों से विरासत में मिली इस धारणा का उपयोग किया जाए तो मेरे साथ सहन करें)।

उदाहरण के लिए, मान लें कि मैं अपनी प्रोजेक्ट फ़ाइलों को एक मेथड नाम से खोजना चाहता हूं, और उस मेथड कॉल के सभी इंस्टेंस को फिर से नाम देना चाहता हूं।

इस प्रकार मैं उदात्तता के साथ आगे बढ़ सकता हूं।

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

कैसे आप इस तरह के रूप में अन्य कार्यक्रमों पर निर्भर रहे बिना विम (संभवतः MacVim) में यह करना होगा ackया sed?

जवाबों:


35

इसे करने बहुत सारे तरीके हैं।

वर्तमान निर्देशिका के अंदर

यदि आप प्रोजेक्ट ट्री में खोज / प्रतिस्थापन करना चाहते हैं, तो आप विम की तर्क सूची का उपयोग कर सकते हैं ।

बस विम खोलें और फिर :argsतर्क सूची को पॉप्युलेट करने के लिए कमांड का उपयोग करें । आप कई फ़ाइल नाम या यहां तक ​​कि ग्लब्स में पास कर सकते हैं।

उदाहरण के लिए, :args **/*.rbरूबी फ़ाइलों के लिए वर्तमान निर्देशिका को पुन: खोज करेगा। गौर करें कि यह भी विम को खोलने जैसा है vim **/*.rb। आप चलकर findवर्तमान निर्देशिका की सभी फ़ाइलों की सूची प्राप्त करने के लिए शेल के कमांड का उपयोग भी कर सकते हैं :

:args `find . -type f`

आप वर्तमान आर्ग सूची :argsको स्वयं चलाकर देख सकते हैं । यदि आप सूची से फ़ाइलों को जोड़ना या हटाना चाहते हैं, तो आप क्रमशः :argaddया :argdeleteकमांड का उपयोग कर सकते हैं।

एक बार जब आप सूची से खुश हो जाते हैं, तो अब आप विम के शक्तिशाली :argdoकमांड का उपयोग कर सकते हैं, जो तर्क सूची में प्रत्येक फ़ाइल के लिए एक कमांड चलाता है::argdo %s/search/replace/g

यहां खोज के लिए कुछ सुझाव दिए गए हैं (कुछ टिप्पणियों के आधार पर):

  1. एक शब्द सीमा का उपयोग करें यदि आप "फू" की खोज करना चाहते थे, लेकिन "फू_बार" नहीं। का प्रयोग करें \<और \>तो जैसे खोज पैटर्न के आसपास निर्माणों::argdo %s/\<search\>/foobar/g
  2. /cयदि आप खोज शब्द की जगह लेने से पहले पुष्टि के लिए पूछना चाहते हैं तो एक खोज ध्वज का उपयोग करें ।
  3. /eयदि आप "पैटर्न नहीं मिला" त्रुटियों को छोड़ना चाहते हैं, तो खोज ध्वज का उपयोग करें ।
  4. आप खोज करने के बाद फ़ाइल को सहेजने का विकल्प भी चुन सकते हैं :argdo %s/search/replace/g | update:। यहां, :updateइसका उपयोग किया जाता है क्योंकि यह केवल फ़ाइल को बचाएगा यदि यह बदल गया है।

बफ़र्स खोलें

यदि आपके पास पहले से ही बफ़र्स हैं, तो आप खोज / प्रतिस्थापित करना चाहते हैं, आप उपयोग कर सकते हैं :bufdo, जो आपकी बफर सूची ( :ls) में हर फ़ाइल के लिए एक कमांड चलाता है ।

आदेश बहुत समान है :argdo: :bufdo %s/search/replace/g

के समान :argdoऔर :bufdo, वहाँ है :windoऔर :tabdoवह क्रमशः खिड़कियों और टैब पर कार्य करता है। वे कम अक्सर उपयोग किए जाते हैं लेकिन अभी भी जानने के लिए उपयोगी हैं।


4
शायद /cप्रतिस्थापनों की पुष्टि के लिए ध्वज का उपयोग करना एक अच्छा विचार हो सकता है ।
रोमेल

3
मैं आंशिक शब्द प्रतिस्थापन से बचने के लिए शब्द सीमाओं \<और \>आस - पास का उपयोग करने की भी सिफारिश करूंगा search
tommcdo

1
एक अन्य टिप्पणी यह ​​है कि विम की कार्यशील निर्देशिका डिफ़ॉल्ट रूप से है जहां आपने vim शुरू किया है, वर्तमान फ़ाइल की निर्देशिका नहीं। आप वर्तमान निर्देशिका का उपयोग करके कार्य निर्देशिका को सेट कर सकते हैं :cd %:p:h। अन्य कार्यशील निर्देशिका विकल्प vim.wikia.com/wiki/Set_working_directory_to_the_current/file में सूचीबद्ध हैं ।
स्टूडीजेक

28

मान लें कि हमारे पास इस तरह की एक सरल परियोजना संरचना है:

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

नमस्कार .xt जैसा दिखता है

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

और जानकारी / age.txt की तरह दिखता है

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

मान लीजिए कि हम सैम की सभी घटनाओं को बॉब के साथ बदलना चाहते हैं। यहाँ हम क्या करेंगे:

  1. कार्यशील निर्देशिका सेट करें

    सुनिश्चित करें कि विम की वर्तमान कार्यशील निर्देशिका परियोजना की जड़ है (आपको यह नहीं दिखाएगी कि यह कैसे करना है)।

  2. ऐसी फाइलें खोजें जिनमें 'सैम' हो

    परियोजना के भीतर सैम की सभी घटनाओं को खोजने के लिए विम के vimgrep कमांड का उपयोग करें (ध्यान दें: **/*सभी फाइलों में खोज)

    :vimgrep /Sam/gj **/*
    

    यह सैम के सभी उदाहरणों के साथ क्विकफिक्स सूची को पॉप्युलेट करेगा। यदि आप क्विकफ़िक्स सूची देखना चाहते हैं, तो आप विम कमांड का उपयोग कर सकते हैं:copen यहाँ छवि विवरण दर्ज करें

  3. सभी फ़ाइलों में 'सैम' सम्‍मिलित करें

    अब हम क्विकफिक्स लिस्ट में हर फाइल के अंदर Vim के विकल्प कमांड को रन करना चाहते हैं। हम :cfdo {cmd}कमांड का उपयोग करके ऐसा कर सकते हैं जो क्विकफ़िक्स सूची में प्रत्येक फ़ाइल में {cmd} निष्पादित करता है। विशिष्ट {cmd} हम उपयोग करना चाहते हैं substituteया sछोटे के लिए। पूरी लाइन की तरह दिखेगा:

    :cfdo %s/Sam/Bob/g
    

    यदि आप चाहें, तो आप सभी प्रतिस्थापनों की पुष्टि करने के लिए c झंडा जोड़ सकते हैं:

    :cfdo %s/Sam/Bob/gc
    
  4. सभी फ़ाइलों को सहेजें

    :cfdo update
    

2
मुझे यह ज्यादा पसंद है। यह सरल है, और Ack (या कोई भी प्लगइन जो QuickFix विंडो को पॉप्युलेट करता है) के साथ काम करता है।
ज़ुहैब

1
यह एक महान जवाब है
लोग

2
"पिछले बदलाव के बाद से कोई लिख नहीं रहा", cfdo %s/Sam/Bob/g | updateमेरे लिए तय कर रहा था कि
hakunin

यदि आप पहले से ही ऐसा नहीं करते हैं तो @hakunin मैं hiddenविकल्प सेट करने की सलाह दूंगा :set hidden
निको बेलिक

3

यद्यपि VIM समाधान नहीं है, यदि आप VI / VIM का उपयोग कर रहे हैं, तो आपको CLI समाधान का उपयोग करना आसान लग सकता है। वर्तमान निर्देशिका की सभी फ़ाइलों को बदलने के लिए, इसका उपयोग perlइस तरह की स्थितियों के लिए किया गया था:

$ perl -pi -e 's/foo/bar/g' *

यदि आपको इसे उपनिर्देशिकाओं में भी करने की आवश्यकता है, तो मैं आमतौर पर इसके perlसाथ जोड़ी बनाता हूं find:

$ find . -name '*' -print0 | xargs -0 perl -pi -e 's/foo/bar/g'

इसके बारे में अच्छी बात यह है कि आप सूची को विशिष्ट फ़ाइल प्रकारों में आसानी से परिष्कृत कर सकते हैं। उदाहरण के लिए, अजगर फ़ाइलों को प्रतिबंधित करने के लिए:

$ perl -pi -e 's/foo/bar/g' *.py
$ find . -name '*.py' -print0 | xargs -0 perl -pi -e 's/foo/bar/g'

1

वाक्यांश को दूसरे के साथ बदलने के लिए, आप VIM Ex मोड का उपयोग कर सकते हैं।

उदाहरण के लिए ( exअन्य नाम है vim -E):

$ ex -s +'bufdo!%s/foo/bar/g' -cxa *.*

पुन: bash / zsh में ( globstarसेट के साथ , उदाहरण के लिए shopt -s globstar):

$ ex -s +'bufdo!%s/foo/bar/g' -cxa **/*.*
$ ex -s +'n **/*.*' +'bufdo!%s/foo/bar/g' -cxa

पुनरावर्ती ( findछिपी हुई फ़ाइलें जैसे फ़ाइलों का उपयोग करना और अनदेखा करना .git):

$ find . -type f -not -path '*/\.*' -exec ex -s +'bufdo!%s/foo/bar/g' -cxa {} "+"

नोट: :bufdoकमांड POSIX नहीं है ।

नोट: सिंटैक्स -not -path '*/\.*'का उपयोग छिपी हुई फाइलों (जैसे .git) को अनदेखा करने के लिए किया जाता है ।



0

यहां शेल कमांड का उपयोग करना findऔर exसंपादक (बिना उपयोग के:bufdo ) है:

find . -name '*.rb' -exec ex +'%s/foo/bar/ge' -V1 -scwq! {} ';'

यह *.rbवर्तमान फ़ोल्डर में सभी फ़ाइलों को इन-प्लेस करेगा (पुनरावर्ती) और इसके fooसाथ प्रतिस्थापित करेगा bar

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