VIM शब्द पेस्ट बफर की सामग्री के साथ बदलें?


110

मुझे एक फ़ाइल में शब्द प्रतिस्थापन का एक गुच्छा करने की आवश्यकता है और इसे vi कमांड के साथ करना चाहते हैं, जैसे EX कमांड नहीं :%s///g। मुझे पता है कि यह विशिष्ट तरीका है जो वर्तमान कर्सर स्थिति में शब्द को प्रतिस्थापित करता है: cw<text><esc>लेकिन क्या ऐसा करने का एक तरीका है अनाम कोड की सामग्री को प्रतिस्थापन पाठ के रूप में और रजिस्टर को अधिलेखित किए बिना?


8
समाधान: अपनी तात्कालिक आवश्यकता के लिए, मैंने 12yl१२ वर्णों का उपयोग किया और "_cw^r0एक शब्द को प्रतिस्थापित करने के लिए। तब मैं .पूरे फ़ाइल में रिप्लेसमेंट को कमांड का उपयोग करने में सक्षम था ।
प्लोंग

जवाबों:


127

मैं "पेस्ट" से सोच रहा हूँ आपका मतलब अनाम (यांक / पुट / चेंज / डिलीट / विकल्प) रजिस्टर है, है ना? (चूंकि यह वह है जो परिवर्तन आदेश द्वारा अधिलेखित हो जाएगा।)

रजिस्टर आम तौर पर टाइप करके निर्दिष्ट किए जाते हैं "फिर रजिस्टर का नाम (एकल वर्ण), जैसे रजिस्टर में "ayफिर से जमा "apकरना a, फिर रजिस्टर की सामग्री डालना a। वही एक परिवर्तन आदेश के लिए जाता है। इस मामले में, यदि आप पाठ आप परिवर्तन कमांड के साथ हटाने के कहीं भी जाने के लिए नहीं करना चाहते, तो आप ब्लैक होल रजिस्टर का उपयोग कर सकते "_: "_cw। फिर एक बार इन्सर्ट मोड में, आप ctrl-R को उस रजिस्टर से हिट कर सकते हैं जो आप चाहते हैं (शायद ") उस रजिस्टर की सामग्री में डाल दें।

  • "* - चयन रजिस्टर (मध्य बटन पेस्ट)
  • "+ - क्लिपबोर्ड रजिस्टर (शायद टर्मिनल के माध्यम से ctrl-shift-v के साथ भी सुलभ)
  • "" - विम डिफॉल्ट (अनाम) यांक / डाल / बदल / हटा / स्थानापन्न रजिस्टर।

संक्षिप्त जवाब: "_cw^R"

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

विम इन रजिस्टरों को यान से पाठ से भरता है और कमांड हटाता है।

क्रमांकित रजिस्टर 0 में सबसे हालिया yank कमांड से टेक्स्ट होता है, जब तक कि कमांड ने दूसरे रजिस्टर को ["x] के साथ निर्दिष्ट नहीं किया है।

क्रमांकित रजिस्टर 1 में सबसे हालिया डिलीट या चेंज कमांड द्वारा डिलीट किया गया टेक्स्ट होता है, जब तक कि कमांड एक और रजिस्टर या टेक्स्ट एक लाइन से कम न हो (छोटा डिलीट रजिस्टर तब उपयोग किया जाता है)। एक अपवाद इन आदेशों के साथ आंदोलन नष्ट ऑपरेटर के लिए किया जाता है: %, (, ), `, /, ?, n, N, {और }। रजिस्टर "1 का उपयोग हमेशा किया जाता है (यह Vi संगत है)।" - यदि लाइन एक पंक्ति के भीतर है, तो रजिस्टर का उपयोग किया जाता है।

प्रत्येक क्रमिक विलोपन या परिवर्तन के साथ, विम रजिस्टर की पिछली सामग्री को रजिस्टर 2 में 2, 3 में 3 और इसी तरह रजिस्टर 9 की पिछली सामग्री को खो देता है।


1
सब ठीक है, मुझे लगता है कि मैंने अभी तक अपने जवाब में रजिस्टरों पर पर्याप्त डॉक्स कॉपी किए हैं? यह सब वहाँ के तहत है :help registers
कैस्केबेल

48

इस पोस्ट में जानकारी का उपयोग करते हुए, मैंने इस उपयोगी मैपिंग का गठन किया है। मैंने 'cp' चुना क्योंकि यह "परिवर्तन पेस्ट" को दर्शाता है

nmap <silent> cp "_cw<C-R>"<Esc>

संपादित करें:

इसके अलावा मैंने इसे एक कदम आगे बढ़ाया और किसी भी प्रस्ताव का समर्थन किया।

ऊपर कमांड के बराबर पाने के लिए यह cpw"पेस्ट शब्द बदलें" के लिए होगा

"This allows for change paste motion cp{motion}
nmap <silent> cp :set opfunc=ChangePaste<CR>g@
function! ChangePaste(type, ...)
    silent exe "normal! `[v`]\"_c"
    silent exe "normal! p"
endfunction

<चुप> यह मेरे लिए काम नहीं करने का कारण बनता है ... किसी भी विचार क्यों ऐसा होगा? मैं मैपिंग और कार्यों में एक n00b हूँ।
हॉलिस्टर

इसके साथ एकमात्र समस्या यह है कि आप के साथ चिपकाने के लिए एक रजिस्टर का चयन नहीं कर सकते ... लेकिन उस मामले में मुझे लगता है कि आप बस cw और उपयोग कर सकते हैं CTRL + R
स्टीव वर्म्यूलेन

2
रजिस्टर नामकरण को जोड़ने का एक बेहतर तरीका हो सकता है लेकिन मेरे लिए निम्नलिखित कार्य हैं: nmap <silent> cp :let g:currentRegister=v:register<cr>:set opfunc=ChangePaste<CR>g@ function! ChangePaste(type, ...) silent exe "normal! `[v`]\"_c".getreg(g:currentRegister) endfunction
स्टीव वर्म्यूलेन

@eventualEntropy यह लाइनों को बदलने के लिए अच्छी तरह से काम करता है, मैं लाइनों के बजाय शब्दों के लिए यह काम कैसे कर सकता हूं, मैं अभी भी सीख रहा हूं। सहायता के लिए धन्यवाद।
Xavitoj चीमा

@XavitojCheema मुझे वह टिप्पणी करना याद नहीं है, हाहा। लेकिन जैसा कि यह पता चला है, मैंने वास्तव में इस कार्यक्षमता प्रदान करने के लिए एक प्लगइन लिखा है ( github.com/svermeulen/vim-easyclip )
स्टीव वर्म्यूलेन

27

आप इसके लिए vim के विजुअल मोड का उपयोग कर सकते हैं। उदाहरण के लिए एक शब्द कॉपी करें: yeऔर फिर कॉपी किए गए शब्द के साथ एक दूसरे को ओवरराइट करें:vep


9
यह काम करता है, लेकिन यह भी ध्यान दिया जाना चाहिए कि दृश्य पेस्ट नए हटाए गए पाठ के लिए यैंक बफर को ओवरराइट करता है।
ostler.c

24

यदि आपका कर्सर उस शब्द पर है जिसे आप अनाम रजिस्टर की सामग्री से बदलना चाहते हैं, तो आप उपयोग कर सकते हैं viwpvदृश्य मोड में स्विच, iwआंतरिक शब्द का चयन करता है, और pरजिस्टर की सामग्री को इसके स्थान पर रखता है।

व्यवहार में, जब मुझे एक शब्द (फ़ंक्शन नाम, आदि) को दूसरे के साथ बदलने की आवश्यकता होती है, तो मैं एक को प्रतिस्थापन के रूप में उपयोग करने के लिए स्थानांतरित करूंगा, yiwआंतरिक शब्द को अनाम रजिस्टर पर ले जाने के लिए, फिर शब्द I पर ले जाऊंगा। मीटर की जगह, और viwpइसे बदलने के लिए। एक शब्द को दूसरे के लिए प्रतिस्थापित करने का सुंदर त्वरित तरीका। यदि आपने /उस शब्द के लिए खोज ( ) की जो आप उसे प्राप्त करने के लिए बदल रहे हैं, तो आप nअगली घटना को प्राप्त करने के लिए बस हिट कर सकते हैं । स्पष्ट रूप से उपयोग करने के लिए कोई विकल्प नहीं है :%s/find/replace/g, लेकिन त्वरित प्रतिस्थापन के एक जोड़े के लिए यह आसान हो सकता है, खासकर यदि आपके पास पहले से ही एक रजिस्टर में नया शब्द है।


4
मुझे आश्चर्य है कि यह स्वीकृत समाधान नहीं है: उपरोक्त सभी, जबकि कुछ किनारे के मामलों में अधिक लचीला , बस 'कहीं और चयन के लिए वर्तमान अनाम रजिस्टर को स्वैप करना' के लिए बहुत अधिक क्रिया है, जो स्थिति मूल है पूछने वाला यहां आया था।
ELLIOTTCABLE

1
यह बहुत उपयोगी और सहज है।
लैकोस्टेनकोडर

6

यदि आप एक नामांकित रजिस्टर का उपयोग करते हैं (अर्थात , अपने पेस्ट रजिस्टर को भरने के लिए उपयोग "ayया "ad, आदि), तो आप कुछ ऐसा कर सकते हैं

cw<CTRL-R>a<esc>

जो रजिस्टर की सामग्री के साथ शब्द को बदल देगा a। जहाँ तक मैं बता सकता हूँ, आप डिफ़ॉल्ट रजिस्टर का उपयोग नहीं कर सकते क्योंकि जब आप cwइसे उस कमांड से कटे हुए शब्द से भर देंगे।


आप डिफ़ॉल्ट रजिस्टर का उपयोग कर सकते हैं! मेरे उत्तर की जाँच करें।
कास्काबेल

2

क्या आपका मतलब सिस्टम पेस्ट बफर या vi रजिस्टर है?

यदि आप सिस्टम पेस्ट बफर का उपयोग करना चाहते हैं तो आप ठीक हैं और कर सकते हैं dw"+P- "एक रजिस्टर चुनता है, और "+सिस्टम पेस्ट बफर है।

अन्यथा नॉन-डिफॉल्ट रजिस्टर "ayमें कॉपी के साथ रजिस्टर में कॉपी करने aऔर फिर कुछ करने के लिए कॉपी करेंdw"aP


धन्यवाद, हामिश। मैंने कोशिश की थी, लेकिन dw"शब्द" पर विचार करने के बाद मैंने व्हाट्सएप को हटा दिया, जबकि cwकेवल शब्द बदल जाता है। उस कारण से, dwमेरे लिए काम नहीं करेगा।
प्लोंग

उस मामले में deआपके लिए काम करना चाहिए - यह इस शब्द के अंत तक dwहटा देगा , जबकि अगले शब्द की शुरुआत तक हटा देगा।
हामिश डाउनर

1

आप ywशब्द को यैंक करने के लिए उपयोग कर सकते हैं , फिर आप शब्द को yanked शब्द से yank शब्द में बदल सकते हैं vipwऔर पहले से लिखे हुए शब्द को चिपका सकते हैं।


0

आप उसके लिए रजिस्टर का उपयोग कर सकते हैं:

रजिस्टर में पहली जगह प्रतिस्थापन पाठ <mark some text>"ay

aरजिस्टर नाम कहां है

तब आप प्रतिस्थापन में उस रजिस्टर का उपयोग कर सकते हैं

ve"ap


दुर्भाग्य से, मैं बस आखिरी, पेस्ट ऑपरेशन को दोहरा नहीं सका ., जो एक और चीज है जिसे मैं करना चाहता था। हालांकि धन्यवाद। बहुत सराहना की।
प्लोंग

0

या आप कर सकते हैं Shift+ v- p(पूरी लाइन का चयन करें और उसके स्थान पर पेस्ट करें)


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