मैं विम के साथ कैसे (ओवरराइटिंग) पेस्ट कर सकता हूं?


31

में vimमैं का उपयोग yyऔर pझटका सब समय और लाइनों पेस्ट करें। हालाँकि, यदि मैं फ़ाइल में एक पंक्ति को कई स्थानों पर बदलना चाहता हूँ, तो मैं इसका उपयोग नहीं कर सकता yy p dd pक्योंकि dd लाइन को क्लिपबोर्ड / रजिस्टर में हटा देता है। जबकि मुझे शायद पता होना चाहिए कि रजिस्टरों का बेहतर उपयोग कैसे किया जाए, मुझे ऐसा लगता है कि संभवत: pवर्तमान लाइन को बदलने का एक तरीका है ।

जवाबों:


27

डिफ़ॉल्ट रूप से, पेस्ट कमांड "("अनाम") रजिस्टर का उपयोग करते हैं । प्रभावी रूप से, कोई भी आदेश जो किसी रजिस्टर को लिखता है, वह अनाम रजिस्टर को भी लिखता है, इसलिए सभी इसे प्रभावित करते हैं, हटाते हैं, और बदलते हैं। यही कारण है कि आपका yank-delete-paste अनुक्रम हटाए गए पाठ के बजाय हटाए गए पाठ को चिपकाता है।

0रजिस्टर यहाँ कर सकते हैं। कोई भी yank कमांड जो रजिस्टर को निर्दिष्ट नहीं करता है, रजिस्टर में yanked टेक्स्ट को 0(इसके अलावा ") डालें । यह डिलीट या ऑपरेशंस को बदलने से प्रभावित नहीं होता है, इसलिए आप इसे इंटरमीडिएट डिलीट या चेंजेस करने पर भी कई बार येंक्ड लाइन पेस्ट करने के लिए इस्तेमाल कर सकते हैं।

  1. yy: रजिस्टरों 0और "दोनों अब yanked लाइन है।
  2. प्रतिस्थापित करने के लिए एक पंक्ति में जाएँ।
  3. dd: रजिस्टर में "अब डिलीट लाइन है, लेकिन रजिस्टर में 0अभी भी yanked लाइन है।
    "0P: रजिस्टर से मूल रूप से yanked लाइन पेस्ट करें 0
  4. प्रतिस्थापित करने के लिए अगली पंक्ति पर जाएं।
  5. dd"0P (ऊपर की तरह)

(बफर की अंतिम पंक्ति को प्रतिस्थापित करते समय कर्सर स्थिति जिस तरह से काम करती है, उसके कारण आप "0pइसके बजाय उपयोग करना चाहेंगे "0P।)

यह ब्रूस एडगर के जवाब के बहुत करीब है , सिवाय इसके कि आपको शुरू में यैंकिंग करते समय एक रजिस्टर निर्दिष्ट करने की आवश्यकता नहीं है। एक या एक से अधिक नामित रजिस्टरों का उपयोग करना बहुत आसान हो सकता है, यदि आपको (उदाहरण के लिए) कुछ पंक्तियों को बदलने की आवश्यकता है AAA, लेकिन अन्य पंक्तियों के साथ BBB( AAAरजिस्टर में डालें a, और BBBरजिस्टर में b(या रजिस्टर में उनमें से एक को छोड़ दें 0), तो उन्हें तदनुसार पेस्ट करें )।

आप एक कीस्ट्रोक को बचाने के लिए 0लाइन-वार विजुअल मोड ( V) से भी पेस्ट कर सकते हैं V"0p:।

यदि आप टाइप करना पसंद नहीं करते हैं "0, तो आपको मैपिंग अधिक सुविधाजनक लग सकती है:

noremap <Leader>p "0p
noremap <Leader>P "0P
vnoremap <Leader>p "0p

_("ब्लैकहोल") रजिस्टर को हटाने के लिए एक वैकल्पिक तरीका है । जब आप इसे हटाते हैं, तो "रजिस्टर प्रभावित नहीं होता है, इसलिए आपका यैंक-डिलीट-पेस्ट अनुक्रम अभी भी अनाम कोड से याँक्ड टेक्स्ट को पेस्ट कर सकता है।

  1. yy: रजिस्टर 0और "अब दोनों yanked लाइन है।
  2. "_dd: रजिस्टरों में कोई बदलाव नहीं।
    P: रजिस्टर से मूल रूप से yanked पाठ चिपकाएँ "

फिर से, आपको एक मैपिंग और अधिक सुविधाजनक मिल सकती है:

noremap <Leader>d "_d

2
या, टीएल; डॉ।, बस का उपयोग करें yy(प्रतिस्थापित करने के लिए लाइन पर जाएं) S<C-r>0<Esc>.कमांड के साथ दोहराने योग्य होने का फायदा है ।
वाइल्डकार्ड

11

लगता है कि केविन के पास बहुत अच्छा जवाब है, लेकिन यदि आप अपने द्वारा हटाए गए प्रत्येक पंक्ति पर आँखें रखना चाहते हैं, तो प्रतिस्थापित करें, थोड़ा अलग समाधान मौजूद है।

1. Find line to copy in some select number of places.
2. Put cursor on it.
3. "ayy copies that line into register 'a'.
4. Find line to replace. Put cursor on it.
5. dd deletes that line. "aP inserts the copied line above where the cursor now lies.
6. Repeat steps 4 and 5.

इस तरह का नुस्खा आपको हटाने और बदलने के लिए लाइनों को खोजने के लिए पैटर्न मिलान का उपयोग करने की अनुमति देता है, और आप फ़ाइल (1G) की शुरुआत में वापस जा सकते हैं और जितनी बार चाहें उतनी बार आगे की खोज कर सकते हैं। यदि मेरे पास बार-बार इकट्ठा होने और जगह बनाने के लिए 2 या अधिक लाइनें हैं, तो मैं "ayyपहली पंक्ति के लिए उपयोग करता हूं , "byyदूसरी के "cyyलिए, तीसरी के लिए और आगे। मुझ पर मानसिक भार कम करने के लिए मैंने एक आदत (जो नुस्खा की व्यापकता को कम कर देता है) को बनाया।


बहुत अच्छा। इसलिए यदि मैं उपयोग करता हूं "ayyऔर फिर dd, ddजो है उसमें प्रतिस्थापित नहीं करेंगे a, लेकिन यदि मैं टाइप pकरता हूं तो वह पेस्ट कर देगा जो अभी उपयोग करके हटा दिया गया था dd। और अगर मैं बदलना चाहता हूं "ayyकि मैं जो हटा रहा हूं, उसमें क्या है , तो मैं उपयोग करूंगा "add- क्या यह सही है?
cwd

"ayy एक लाइन को रजिस्टर 'a' में कॉपी करता है।" dd "एक लाइन को एक डिफॉल्ट रजिस्टर में काटता है, न कि 'a'। 'p' डिफ़ॉल्ट रजिस्टर को पेस्ट करता है, सही है। और हां," एक लाइन को 'रजिस्टर' में काटता है। , जो "अय्य कमांड" से सामग्री को प्रतिस्थापित करेगा।
ब्रूस एडगर

5

ऐसा करने के लिए कुछ तरीके हैं :s, जो इस बात पर निर्भर करता है कि आप कितना टाइपिंग करना चाहते हैं। सबसे आसान तरीका एक सरल खोज और प्रतिस्थापित करना है:

:%s/find this line/replace with this/

%पूरी फ़ाइल खोज और सभी घटनाओं की जगह लेगा।

यदि आपके लिए यह बहुत अधिक टाइपिंग है, तो आप गंतव्य स्ट्रिंग ( yy) और "(डिफ़ॉल्ट) रजिस्टर का उपयोग कर सकते हैं , इसे इसके साथ सम्मिलित कर सकते हैं Ctrl+r ":

:%s/<ctrl+r><">/replacement/

या, यदि आपके पास प्रतिस्थापन स्ट्रिंग की एक प्रति है, तो आप दोनों को अलग-अलग रजिस्टरों में "ayyऔर क्रमशः और रजिस्टरों "byyमें यैंक कर सकते हैं (आप अपने रजिस्टरों के लिए किसी भी पत्र का उपयोग कर सकते हैं)। फिर उपयोग करें और उन्हें खोज में पेस्ट करें और फ़ील्ड बदलें।abCtrl+r aCtrl+r b

ब्रूस के लिए एक नहीं, लेकिन यदि आप उन्हें बदलने से पहले लाइनों की जांच करना चाहते हैं, तो बस cविकल्प जोड़ें :

:%s/find this line/replace with this/c

2

आप Vउस लाइन को हाइलाइट करने के लिए उपयोग कर सकते हैं जिसे आप विज़ुअल मोड में बदलना चाहते हैं और फिर ppउस लाइन पर पेस्ट करने के लिए हिट करें।

यह केवल एक कीस्ट्रोक जोड़ता है, इसलिए यह एक बहुत अच्छा समाधान लगता है।


यह काम नहीं करता है: पेस्ट के बाद, क्लिपबोर्ड में वह पाठ होता है जिसेV
daniel kullmann

बस एक ही p
हारून थोमा

2

मैं c"परिवर्तन" का उपयोग करता हूं , इस तरह की चीज के लिए नियमित खोज के साथ संयुक्त रूप से बहुत बार आदेश देता है। आप प्रत्येक पंक्ति / पाठ के उस टुकड़े के लिए फ़ाइल खोज सकते हैं जिसमें आप रुचि रखते हैं और फिर अंतिम n.आदेशों का उपयोग करें ( nअगले और फिर .अंतिम परिवर्तन को दोहराने के लिए।)

/^hello- नमस्ते के साथ शुरू होने वाली रेखा खोजें;
c$goodbye- अलविदा को बदलने की रेखा;
n.- रिपीट फाइंड, रिपीट चेंज

यदि आप फ़ाइल में पहले से ही लाइन को एक में बदलना चाहते हैं, तो आप इसे केवल अपने इनपुट बफर में कॉपी कर सकते हैं (यह मानते हुए कि आपका GUI इसे अनुमति देता है) और फिर पहले परिवर्तन कमांड की सामग्री प्राप्त करने के लिए पेस्ट करें।

Vi सभी चीजों की तरह, आपकी जेब में बहुत सारे विकल्प होना एक अच्छा विचार है, जो इस बात पर निर्भर करता है कि आप किस तरह का एडिट करना चाहते हैं।

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