2012-06-22 17 views
8

मेरी एक ऐसी स्थिति थी जहां मैं एक फ़ाइल के माध्यम से बीएआर के साथ बीएआर को प्रतिस्थापित करना चाहता था; हालांकि, मैं केवल कुछ स्थानों पर ऐसा करना चाहता हूं, 68-104, 500-537, और 1044-1195 के बीच कहें। व्यवहार में मैं ब्याज की तर्ज पर मार्कर (मा, mb, एम सी, ...) गिरा दिया, और मैं निम्नलिखित भाग गया:विम खोज और प्रतिस्थापित करें - कुछ लाइनों को सीमित करें

:'a,'b s/FOO/BAR/g | 'c,'d s/FOO/BAR/g | 'e,'f s/FOO/BAR/g 

मैं अलग खोज के साथ कई बार इस दर्जनों दोहराने और की जगह शर्तों रों करना पड़ा/सीएटी/डीओजी, इत्यादि, जो हर बार कमांड लाइन को फिर से लिखना पड़ता है। मैं भाग्यशाली था कि मेरे पास केवल 3 स्थान थे जिन्हें मैं अपनी खोज को सीमित करना चाहता था (कल्पना करें कि 30 या 40 थे, कमांड लाइन कितनी गन्दा हो जाएगी)।

कोई फ़ंक्शन लिखने का छोटा, क्या ऐसा करने का कोई साफ तरीका है?

संबंधित नोट पर। मैं 'एस' (खोज) रजिस्टर, और 'आर' के लिए बार (की जगह) के लिए FOO की नकल की और

:'a,'b s/\[email protected]/\[email protected]/ | 'c,'d s/\[email protected]/\[email protected]/ | 'e,'f s/\[email protected]/\[email protected]/ 

यह मैं प्रत्येक कमांड लाइन को फिर से लिखने के लिए होने बचाया है | की एक कमांड लाइन करने की कोशिश की समय, लेकिन हां यह काम नहीं किया। प्रतिस्थापन बिट ठीक था \ = @ r, लेकिन खोज पैटर्न में \ = @ s ने एक त्रुटि दी।

किसी भी सुझाव की सराहना की जाएगी।

+0

तुम भी उपयोग कर सकते हैं नियंत्रण-पी और नियंत्रण -एन (मुझे लगता है) पिछले आदेशों के माध्यम से चक्र के लिए। यह आदेशों को फिर से टाइप करने की आवश्यकता को खत्म करना चाहिए। – jahroy

+0

यदि यह सहायक था, तो जवाब स्वीकार करना सामान्य है। – epsilonhalbe

उत्तर

2
इसके बजाय यह एक मार्कर का उपयोग करें का उपयोग करने का

:

:68,104s/FOO/BAR/g << substitue from line 68 to 104

यह एक छोटा सा आसान है और स्पष्ट अपने काम करना चाहिए।

5

यदि आपको लाइनों के विभिन्न श्रेणियों के समूह पर लाइन-वार ऑपरेशंस (जैसे प्रतिस्थापन) का एक सेट करने की आवश्यकता है, तो आप जिस चाल का उपयोग कर सकते हैं वह है कि पहले से एक उपसर्ग जोड़ने के लिए उन पंक्तियों को अलग दिखाना है (वह नहीं है ' किसी अन्य लाइन द्वारा साझा नहीं किया गया)।

जिस तरह से मैं आमतौर पर ऐसा करता हूं, पहली फ़ाइल पर >G जैसे किसी फ़ाइल के साथ पूरी फ़ाइल को इंडेंट करना है, और उसके बाद :s/^ /X/ आदेश या ब्लॉक-विज़ुअल का उपयोग एक्स के साथ अग्रणी रिक्त स्थान को प्रतिस्थापित करने के लिए करें।

फिर :s के साथ :g का उपयोग करें। उदाहरण:

:%g/^X/s/FOO/BAR/g 
:%g/^X/s/BAZ/QUUX/g 

अंत में, अस्थायी उपसर्ग हटाएं।

+0

मैं देखता हूं कि आप क्या कर रहे हैं - मेरी सीमा में प्रत्येक पंक्ति के लिए पहले कॉलम में अस्थायी चिह्न डालना। यह एक अच्छा विचार है धन्यवाद। (दुर्भाग्यवश यह इस मामले में काम नहीं करेगा क्योंकि पाठ फ़ाइल स्रोत कोड थी, और मैं संकलित करना चाहता था क्योंकि मैं साथ गया था।) –

+1

आप कोड लाइनों को अलग करने के लिए समाप्त होने वाली प्रत्येक पंक्ति पर एक टिप्पणी डाल सकते थे, जो हस्तक्षेप नहीं करना चाहिए संकलन के साथ। – epsilonhalbe

2

q: से, आप पिछले कमांड लाइन याद कर सकते हैं और उन्हें एक सामान्य विम बफर के रूप में संपादित करते हैं, तो आप जल्दी से कुछ के साथ FOO और BAR जगह ले सकता है और कुछ है, तो पुन: निष्पादित के साथ लाइन दर्ज करें।

s/\[email protected]/\[email protected]/ काम नहीं करता है; जैसा कि आपने कहा था, यह केवल प्रतिस्थापन भाग में काम करता है। लेकिन पैटर्न के लिए, आप \[email protected] के बजाय, रजिस्टर रों की सामग्री सम्मिलित करने Ctrl +आरCtrl +आररों उपयोग कर सकते हैं। पसंदीदा रूप से डिफ़ॉल्ट रजिस्टर का उपयोग करें, फिर यह एक साधारण s// है, लेकिन आप शायद पहले से ही जानते हैं।

+0

_q: _ मतलब क्या है? – jahroy

+0

आह! मुझे क्यू नहीं पता था: कमांड - अच्छा! –

3

@ VDT के जवाब से प्रेरित:

मुझे यकीन है कि नहीं कर रहा हूँ, लेकिन आप एक फ़ाइल और स्रोत है कि फाइल मुझे लगता है कि सभी प्रतिस्थापन लिख सकता है। substitutions.vim:

68,104s/FOO/BAR/g 
168,204s/FOO/BAR/g 
618,644s/FOO/BAR/g 
681,1014s/FOO/BAR/g 
. 
. 
. 
68,104s/BAZ/BOOO/g 
168,204s/BAZ/BOOO/g 

और फिर :so substitutions.vim हो सकता है आप भी इस एक ही संरचना के एक से अधिक फ़ाइलों के लिए उपयोग कर सकते हैं। अनदेखा त्रुटि संदेश जोड़ने के लिए आप e जोड़ सकते हैं, यदि यह स्पष्ट नहीं है कि प्रतिस्थापन संबंधित लाइन ब्लॉक पर पाए जाते हैं।

+0

हां, यह भी काम करता। मुझे 'ई' ध्वज नहीं पता था - धन्यवाद। 'E' के लिए –

+0

मुझे http://stackoverflow.com/questions/11146763/about-a-key-binding-to-remove-trailing-spaces-and-save/11146887#11146887 पर यह उत्तर देना है @ pb2q – epsilonhalbe

+0

ps मैंने अभी परीक्षण परीक्षा पर यह कोशिश की है, और यह एक आकर्षण की तरह काम करता है। धन्यवाद। –

2

जब एक बंद गुना पर प्रदर्शन किया जाता है, प्रतिस्थापन उस गुना तक ही सीमित होते हैं।

  1. प्रत्येक क्षेत्र
  2. एक पर कर्सर रखें गुना बंद कर दिया गुना
  3. प्रतिस्थापन करते हैं: :s/foo/bar<CR>
  4. अगले करने के लिए कदम zj या zk
  5. कमांड लाइन इतिहास का उपयोग के साथ गुना बंद कर दिया: :<C-p><CR> या :<Up><CR> एक ही प्रतिस्थापन
  6. दोहराने के लिए ...

आप अपने प्रतिस्थापन के अंत में c ध्वज भी जोड़ सकते हैं ताकि विम वास्तव में इसे करने से पहले एक पुष्टिकरण के लिए पूछ सके। यदि आपके पास बहुत सारे मैच हैं तो यह कठिन हो सकता है।

4

आदेश में खोज पैटर्न, प्रतिस्थापन स्ट्रिंग और झंडे फिर से टाइप आवश्यकता से छुटकारा पाने के लिए, एक बस & ध्वज के साथ :& आदेश का उपयोग कर सकते हैं:

:'a,'bs/pat/str/g|'c,'d&&|'e,'f&& 
+0

: और मुझ पर एक नया है। धन्यवाद, यह बहुत आसान में आ जाएगा। –

+0

@ डेव: यह वास्तव में आसान है। यदि मैं सही ढंग से प्रश्न को समझता हूं, तो ': &' कमांड का उपयोग करके कहा गया मुद्दा हल करता है, है ना? –

+0

उदाहरण में मैंने दिया, हाँ यह सही धन्यवाद है। हालांकि, अगर मेरे पास कई स्थान थे जो मैं खोजना चाहता था तो मुझे लगता है कि @ eipson-2-halbe का उत्तर अधिक व्यावहारिक हो सकता है। मान लें कि मेरे पास 40 स्थान थे, फिर बाहरी टेक्स्ट फ़ाइल को सोर्स करना अधिक प्रबंधनीय हो सकता है जो कमांड लाइन पर 40 'xxx,' yyy && प्रविष्टियां डालता है। आपके दोनों तरीकों का संयोजन शायद जाने का रास्ता है! –

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