vim - मैं वर्तमान पेस्ट बफर का उपयोग करके 'परिवर्तन शब्द' कैसे कर सकता हूं


86

मेरे पास मेरे बफ़र में कुछ पाठ है, जैसे मैंने एक yw(यंक शब्द) किया और अब मेरे बफ़र में 'फू' है।

मैं अब 'बार' शब्द पर जाता हूं और मैं इसे अपने पेस्ट बफर के साथ बदलना चाहता हूं।

पाठ को मैन्युअल रूप से बदलने के लिए मैं कर सकता था cwऔर फिर नया शब्द टाइप कर सकता था ।

मैं 'परिवर्तन शब्द' कैसे कर सकता हूँ, लेकिन प्रतिस्थापन शब्द को मैन्युअल रूप से टाइप करने के बजाय मेरे पेस्ट बफर की सामग्री का उपयोग कर सकता हूँ?

मेरे पास अभी सबसे अच्छा विकल्प यह है कि मैं उस शब्द की शुरुआत में जाऊं जिसे मैं बदलना चाहता हूं और करना dw(शब्द हटाना), फिर दूसरी जगह पर जाकर yw(यंक शब्द) करना है, फिर वापस प्रतिस्थापन क्षेत्र में जाएं और करें p(पेस्ट) जो थोड़े अनाड़ी हैं खासकर यदि वे एक ही स्क्रीन पर नहीं हैं।

जवाबों:


120

विकल्प 1

आप इसे करने के लिए रजिस्टरों का उपयोग कर सकते हैं और इस प्रक्रिया के लिए कीबाइंडिंग बना सकते हैं।

शब्द को आप के साथ बदलना चाहते हैं yw

Yanked शब्द 0रजिस्टर में है जिसे आप जारी करके देख सकते हैं :registers

उस शब्द पर जाएं जिसे आप बदलना चाहते हैं और करें cw। रजिस्टर पेस्ट करने के लिए Do Ctrl+ का rपालन करें ।00

इसके लिए नक्शा कुछ इस तरह दिखाई देगा (मान लेना Ctrl+ jहमारी कुंजी कॉम्बो के रूप में):

:map <C-j> cw<C-r>0<ESC>

विकल्प 2 (सरल)

अपने शब्द के साथ, जिस शब्द को आप बदलना चाहते हैं, उस पर कर्सर रखें viwp। जो विजुअल सिलेक्ट इनर वर्ड और पेस्ट है।

टिप्पणियों में @tlo के सौजन्य से: आप भी बस कर सकते हैं vep। एक चार छोटी। डाउनसाइड को शब्द की शुरुआत में कर्सर रखना है और (जैसा कि मेरा है) बफर को बदलता है।

टिप्पणी (माइकल से):

यह अच्छा है। अतिरिक्त नोट: दूसरी विधि वास्तव में आसान है लेकिन, जैसा कि, केवल एक प्रतिस्थापन के लिए काम करता है क्योंकि प्रत्येक प्रतिस्थापन के बाद बफर फिर उस फ़ील्ड में बदल जाता है जिसे बदल दिया गया था (पुराना पाठ)। BUT का उपयोग करने के लिए पहली विधि थोड़ी कठिन है, इसका लाभ यह है कि बफर 0 'जैसा है' है, इसलिए आप उसी विधि का उपयोग 1 पाठ के 1 से अधिक प्रतिस्थापन करने के लिए कर सकते हैं।


14
विकल्प 3 (और भी सरल): अपने शब्द के साथ, जिस शब्द को आप बदलना चाहते हैं और जिस शब्द को करना चाहते हैं उसके पहले वर्ण पर कर्सर रखें vep
tlo

मुझे विकल्प 3 पसंद है जब बदलने के लिए केवल 1 शब्द है। यदि बदलने के लिए एक ही शब्द से अधिक है, तो विकल्प 1 मुझे उपयोग करने की अनुमति देता है। ऑपरेटर इसे दोहराने के लिए ..
टाइपेलोगिक

3
ve"0pआपको अपने परिवर्तन को दोहराने के लिए काम करेगा
Jillillian

यदि आप इसे किसी चीज़ में मैप करने जा रहे हैं, तो इसका उपयोग करना बेहतर होगा: map <C-j> ciw<C-r>0<ESC>ताकि आपके द्वारा दबाए गए शब्द में यह कोई फर्क न पड़े ^j
पॉल पार्कर

कोई भी जानना चाहता है कि CTRL-R यह जादू क्यों करता है: :help insertतो CTRL-R खोजें /CTRL-R। कैसे ve"0pकाम करता है, इसके लिए:help registers
पॉल पार्कर

12

ywअपने शब्द को yank करने के लिए, फिर कर्सर को उस शब्द पर ले जाएँ जिसे आप बदलना चाहते हैं और "_dwइसे हटाने के लिए उपयोग करते हैं, पाठ को अशक्त रजिस्टर में भेजते हैं (इसलिए यह रजिस्टर की सामग्री को अधिलेखित नहीं करता है ", जहाँ yanked / cut text डिफ़ॉल्ट रूप से जाता है ), और फिर बस के साथ चिपकाएँ p

आप चीजों को थोड़ा आसान बनाने के लिए निम्न मानचित्रण का उपयोग कर सकते हैं:

nnoremap <leader>d "_d

... तो सामान्य मोड में, आप रजिस्टर \dwको प्रभावित किए बिना, एक शब्द को हटाने के लिए उपयोग कर सकते हैं "


3

VIM तरीके से ऐसा करने के लिए, आप जानबूझकर यान, डिलीट और अन्य रजिस्टरों का उपयोग करते हैं।

रजिस्टर "0यैंक रजिस्टर है। आपके पास जो कुछ भी है, उसे यहां डाल दिया जाएगा, लेकिन डिलीट रजिस्टर को कभी नहीं छूएगा "0

इसलिए, आपके उदाहरण में, आपने केवल एक शब्द लिखा था। एक शब्द को बदलने के लिए जिसे आपने अभी-अभी yanked किया है, आप विलोपन का लाभ उठाते हुए कभी भी yank रजिस्टर को नहीं छूते हैं। इसलिए लक्ष्य शब्द पर जाएं, इसे हटाएं dw, फिर अपने यैंक-रजिस्टर से पेस्ट करें "0p, या इससे बेहतर, cwफिर ^R0(जो दोहराए जाने योग्य है)।

यैंक रजिस्टर के विपरीत एक छोटा विलोपन रजिस्टर है "-। कोई भी छोटी-मोटी डिलीट या चेंज रिमूवल यहाँ डाल दी जाती है, लेकिन कभी भी टच नहीं होता है "-। एक विलोपन छोटे के रूप में गिना जाता है अगर यह एक पूर्ण रेखा से कम है।

रजिस्टर "1- "9डिलीट हिस्ट्री रजिस्टर हैं। साथ "1नवीनतम बड़े विलोपन या परिवर्तन हटाने युक्त, और "9सबसे पुराने बड़े विलोपन या परिवर्तन हटाने से युक्त। केवल वे ही हटाए जाते हैं जो छोटे नहीं होते, अर्थात एक पंक्ति या उससे अधिक की हटाए जाने पर, धकेल दिए जाते हैं "1- "9

रजिस्टर को बदलने वाले किसी भी ऑपरेशन के लिए, एक कॉपी हमेशा डिफ़ॉल्ट, उर्फ ​​अनाम रजिस्टर में भी रखी जाती है ""। जब आप स्पष्ट रूप से रजिस्टर का नाम नहीं देते हैं तो यह रजिस्टर का उपयोग किया जाता है।

रजिस्टर "_ब्लैक होल रजिस्टर है, और यह हमेशा खाली होता है। यदि आप इसे हटाते हैं, तो किसी भी रजिस्टर में कुछ भी नहीं बदला जाता है, यहां तक ​​कि डिफ़ॉल्ट ""रजिस्टर या ब्लैक होल रजिस्टर भी नहीं। हटाया गया पाठ आपके पूर्ववत इतिहास के अलावा पूरी तरह से चला गया है। ब्लैक होल रजिस्टर से यांक करना या चिपकाना अनिवार्य रूप से कुछ भी नहीं करता है।

ब्लैक होल रजिस्टर "_आपको पहले एक छोटे से विलोपन जैसी चीजों को करने देता है, फिर "_आपके छोटे विलोपन रजिस्टर को बदले बिना कई अन्य विलोपन करता है "-, फिर अपना पहला छोटा विलोपन पेस्ट करें।

अन्य रजिस्टर अंतिम सम्मिलित रजिस्टर "., फ़ाइल नाम रजिस्टर "%और "#कमांड रजिस्टर ":, खोज रजिस्टर "/और अभिव्यक्ति रजिस्टर हैं "=

आप कमांड द्वारा इन सभी रजिस्टरों और उनकी सामग्री की सूची प्राप्त कर सकते हैं :register। यह कमांड प्रयोग करने और सीखने के लिए बहुत उपयोगी है कि कहां समाप्त होती है।


2

मुझे इसकी इतनी बार आवश्यकता है, मैंने सरल बनाने और अधिकतम गति की अनुमति देने के लिए एक प्लगइन लिखा है: रिप्लेसविथग्रेस्टर

यह प्लगइन एक दो-इन-वन grकमांड प्रदान करता है जो एक {प्रस्ताव} / टेक्स्ट ऑब्जेक्ट, संपूर्ण लाइन (ओं) या एक रजिस्टर की सामग्री के साथ वर्तमान चयन द्वारा कवर पाठ को बदलता है; पुराने पाठ को ब्लैक-होल रजिस्टर में हटा दिया गया है, अर्थात यह चला गया है। यह पारदर्शी रूप से कई कोने के मामलों को संभालता है और मानक .कमांड के माध्यम से त्वरित दोहराने की अनुमति देता है । क्या आपको यह पसंद नहीं आना चाहिए, इसके पृष्ठ में विकल्पों के लिंक हैं।


2

पेस्ट को दोहराने के लिए परिवर्तन कमांड का उपयोग करें।

cw ^R0ESC (^ आर = कंट्रोल + आर; 0 रजिस्टर के लिए 0)

reg से सामग्री के साथ शब्द को बदल देगा। 0 और चलो आप इसे दोहराते हैं.

cgnखोज पैटर्न बदलने के लिए यह (VIM 7.4) के लिए बहुत अच्छा है :

  • पहले खोज /या*
  • cgn ^R0ESC
  • .अगले मैच को दोहराने या nछोड़ने के लिए

1

चूंकि यह अभी तक शामिल नहीं है, आप आमतौर पर स्ट्रिंग को बदलते हैं :%s/.../.../और आप इसे अपने कर्सर के तहत शब्द के साथ भी कर सकते हैं।

  1. आप कमांड के पहले भाग को दर्ज करते हैं, जिसे आप खोज रहे हैं: :s/find/
  2. फिर आप <ctrl-r>उस कर्सर पर क्लिक करें और चुनें, जिस शब्द के साथ आप उसे बदलना चाहते हैं।
  3. फिर आप कर्सर को कमांड लाइन में शब्द पेस्ट करने के लिए <ctrl-w>(छोटा "शब्द") या <ctrl-a>(बड़ा "शब्द) पर क्लिक करें
  4. फिर आप कमांड को पूरा करें।

कमांड लाइन में कर्सर सामान का उपयोग कैसे करें के बारे में लिंक देखें ।


1

मैं आमतौर पर इस का उपयोग करें: ywझटका foo, फिर हटाने barके साथ dw, और अंतिम चरण, डाल के रूप में fooरजिस्टर से 0जो उपयोग करते हुए पाठ yanked धारण "0p.आवश्यकतानुसार अवधि ( ) के साथ दोहराएं ।

इसके अलावा, के बजाय ywऔर dw, आप का उपयोग कर सकते हैं yiwऔर diw(अतिरिक्त नोटिस i- यह अंदर का मतलब है )। इसके साथ ही आप शब्द की शुरुआत में ही नहीं, इसके अंदर किसी भी स्थान से शब्द को हटा सकते हैं या हटा सकते हैं ।


0

मैं चयन क्षेत्र के विस्तार के लिए इस प्लगइन का उपयोग करता हूं: https://github.com/terryma/vim-expand-region

तो एक शब्द बदलने के लिए मेरा संयोजन होगा: vvpएक शब्द के किसी भी स्थान पर।

मेरे पास पेस्ट के बाद अनाम रजिस्टर सामग्री को सहेजने के लिए एक हैक भी है, इसलिए मैं इसे दोहरा सकता हूं।

vnoremap p p:let @"=@0 <CR>
vnoremap P P:let @"=@0 <CR>

(मेरा क्लिपबोर्ड ऑटोसेक्ट है)


0

मैं कॉपी किए गए शब्द के साथ वर्तमान शब्द को बदलने के लिए नीचे कुंजी मैपिंग का उपयोग कर रहा हूं।
" replace with Register 0
map <leader>rr ciw<C-r>0<Esc>

yiwएक शब्द कॉपी करें। किसी शब्द पर नेविगेट करें। ,rrशब्द बदलें।
लीडर की को मैप है ,


,rwअधिक समझ में आता है, और QWERTY पर शायद एक smidgen आसान और तेजी से बाहर बेल्ट है। DVORAK पर, मैंने चुना ,rc, हालांकि यह बिल्कुल समझ में नहीं आता है, यह उन सभी की तुलना में आसान और तेज है। DVORAK पर, ,rwएक हॉरर शो है;)
पॉल पार्कर

0

सबसे पहले, उस शब्द की शुरुआत में नेविगेट करें जिसे आप yank करना चाहते हैं। यदि आप शब्द के बीच में हैं, तो बस bइसे शुरू करने के लिए वापस जाएँ। फिर yeपूरे शब्द को किसी भी अनुगामी रिक्त स्थान ( yएनके से eएनडी) के बिना करना है। अंत में, उस शब्द पर जाएं, जिसे आप बदलना चाहते हैं - शायद wकुछ बार करके - और इसुअल चयन मोड में vepप्रवेश vकरने के लिए e, शब्द की एनडी के लिए चयन करें , और pअंतिम yanked सामग्री को अस्ट करें ।

(यदि कोई जानना चाहता है कि मैंने केवल स्वीकार किए गए उत्तर पर टिप्पणी क्यों नहीं yeकी yw, इसके बजाय उपयोग करने के छोटे संशोधन के लिए , यह इसलिए है क्योंकि इस स्टैक पर मेरी प्रतिष्ठा अभी भी बहुत कम है।)


0
  1. ywदुनिया का उपयोग करने के लिए उपयोग करें, उस दुनिया में जाएं जिसे आप बदलना चाहते हैं।
  2. vदुनिया का चयन करने के लिए उपयोग करें, veया vwअपनी स्थिति पर निर्भर करता है।
  3. pचयनित ब्लॉक को बदलने के लिए आपके द्वारा कॉपी की गई दुनिया को विराम देने के लिए दर्ज करें

0

दूसरे बेहतर जवाबों को जोड़ते हुए। थोड़ा बहुत स्पष्ट है, लेकिन आप हटाने से पहले बस पेस्ट कर सकते हैं। 'yw' तब उस शब्द को जाएं जिसे आप बदलना चाहते हैं, 'pldw' (पेस्ट, एक वर्ण को सही स्थानांतरित करें, शब्द हटाएं।

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