मूल शब्द टाइप किए बिना विम में खोजने और बदलने के लिए कैसे?


53

मैं अपने "खोजने और बदलने के लिए" वर्कफ़्लो को विम में ऑप्टिमाइज़ करना चाहूंगा। यह कुछ ऐसा है जो मैं अक्सर करता हूं, क्योंकि मुझे यकीन है कि आप में से अधिकांश भी करते हैं। आमतौर पर कुछ की तर्ज पर - एक ब्लॉक की प्रतिलिपि बनाएँ और कुछ स्थानों में एक चर का नाम बदलें। मुझे पता है, मुझे पता है, कि शायद आपके "ट्रिगर क्यों हो रहे हैं और कोड चिपका रहे हैं" पलटा, लेकिन चलो उस सड़क से नीचे नहीं जाते ... बहुत सारे वैध उपयोग के मामले हैं :)

मैं खोज के बारे में अच्छी तरह से वाकिफ हूँ और आज्ञाओं को प्रतिस्थापित कर रहा हूँ: :sया :%sमैं उन्हें पसंद नहीं करता। यह मुझे उस पूर्ण चर नाम को टाइप करने के लिए बाध्य करता है जिसे मैं खोज रहा हूं और मैं इसे किसके लिए बदल रहा हूं। हो सकता है कि टाइपिंग की मात्रा तय करने का एक बेहतर तरीका हो :%s? मैं अक्सर लंबे वर्णनात्मक चर नामों का उपयोग करता हूं, इसलिए यह वास्तव में मेरे लिए एक सौदा ब्रेकर है। मुझे यह भी पसंद नहीं है कि स्क्रैच से एक चर नाम टाइप करना कैसे टाइपो प्रवण है और टाइपो नीचे शिकार समय और ब्रेनपावर का उपभोग कर सकता है। मैं इसे एक बार टाइप करना पसंद करता हूं, और फिर इसे कॉपी करना और चिपकाना सिर्फ अगर संभव हो तो इससे पूरी तरह से बचना चाहिए।

मेरे वर्तमान वर्कफ़्लो आंदोलन के कुछ संयोजन का उपयोग करता है / yank / select / search / फ़ाइल के चारों ओर घूमने और एक-एक करके बदलने के लिए डाला जाता है। यह बहुत अच्छा नहीं है लेकिन पूर्ण चर नामों को टाइप करने से बचने का लाभ है। मुझे बस पहले कुछ अक्षरों को टाइप करने की जरूरत है /या दूसरे आंदोलन कमांड (जैसे fx) का उपयोग करने के लिए जो कि आस-पास है और उसके बाद veपूरे शब्द का चयन करने के लिए मारा जा सकता है। मुझे भी कोई आपत्ति नहीं है कि मुझे हर उदाहरण के लिए दोहराना है। मैं प्रत्येक परिवर्तन की पुष्टि किए बिना कभी भी पूर्ण खोज नहीं करता हूं। लेकिन यह बहुत बेहतर होगा यदि मैं एक कीस्ट्रोके के साथ प्रतिस्थापन की कार्रवाई को दोहरा सकता हूं (जो मैं इस पद्धति के साथ नहीं कर सकता)। प्रत्येक प्रतिस्थापन आमतौर पर की तरह कुछ है nतो veउसके बाद p(या भी बदतर "0p)

क्या कोई तेज़ तरीका है?


1
.पिछले "कमांड ब्लॉक" को दोहराता है (सटीक शब्द के बारे में निश्चित नहीं। उदाहरण के लिए: हटो + क्रिया + पाठ। उदाहरण के लिए: cwtoto<Esc>(कर्सर से शब्द के अंत तक "टोटो" के साथ), c/foo<enter>bar<Esc>(कर्सर से सिर्फ पहले से परिवर्तन ) फू ", और" बार "से बदल दें)। फिर आप स्थानांतरित कर सकते हैं (कर्सर के साथ, hjkl, या एक नंबर + hjkl (यह n बार करता है), G (फ़ाइल के अंत में जाएं), / कुछ (पहले बस जाएं) कुछ "), आदि) और फिर .उसी" कमांड ब्लॉक "को फिर से प्रेस करने के लिए दबाएं
ओलिवियर दुलैक

मैं यह काफी एक सा उपयोग करते हैं! हालाँकि, यह काम नहीं करता है यदि आप एक शब्द को अलग करना चाहते हैं और फिर एक शब्द को इसके साथ कई स्थानों पर प्रतिस्थापित करते हैं। यही मुख्य उपयोग मामला है जिसके साथ मुझे कोई समस्या है, और कुछ ऐसा ही होता है n ve "0p। जो दुर्भाग्य से सिर्फ एक के साथ दोहराया नहीं जा सकता है.
जोएल

5
n ce ctrl-r 0 <esc> n.n.n.n.n.n.
अमीर

@ यदि आप एक मैक्रो रिकॉर्ड कर सकते हैं (qa तब सब कुछ जो आप चाहते हैं, तब q: मैक्रो बनाता है), और फिर उपयोग करें: @ ए इसे फिर से खेलना (और, हमेशा की तरह, 134 @ a यह 134 बार करना)। मैक्रो जरूरत के अनुसार विस्तृत हो सकता है (उदाहरण: कुछ ढूंढें, उचित स्थान पर जाएं, फिर शब्द को उस में बदलें, फिर उचित स्थान पर ले जाएं ताकि फिर से बेहतर स्थिति में बुलाया जा सके)
ओलिवियर दुलैक

1
मैंने इस प्रश्न से अधिक उपयोगी वीआईएम ट्रिक्स सीखे हैं जो साइट पर किसी अन्य प्रश्न से हैं। धन्यवाद!
डॉटनचेन

जवाबों:


81

मेरे पास वास्तव में आपके समान एक समान वर्कफ़्लो है, (कॉपी और चिपकाने वाले ब्लॉक जो समान हैं, फिर :sवैरिएबल नाम बदलने के लिए उपयोग कर रहे हैं) खासकर जब मैं बहुत सारी लाइनें लिख रहा हूं जो समान हैं, सिवाय इसके कि वे किस वेरिएबल का उपयोग करते हैं। लेकिन कुछ चीजें हैं जो मैं करता हूं कि आप उपयोगी पा सकते हैं।

सामान्य व्यर्थ की बातें

  1. पहली चीज जो आपको यह महसूस करने में मदद करेगी कि :s//foo/gजो भी खोज शब्द आपने आखिरी में इस्तेमाल किया था, उसे भर देंगे और उसे फू के साथ बदल देंगे । यह अकेला बहुत समय बचा सकता है, लेकिन जब आप इसे तारांकन आदेश (वर्तमान कर्सर के तहत शब्द के लिए खोज) के साथ जोड़ते हैं तो यह बहुत समय बचाता है। उदाहरण के लिए, करने के बजाय सभी fooको बदलने के लिएspam

    :%s/foo/spam/g
    

    जिसके लिए आपको फू और स्पैम (जो लंबे चर हो सकते हैं) टाइप करने की आवश्यकता है, आप बस फू को नेविगेट कर सकते हैं, और कर सकते हैं:

    *:%s//spam/g
    

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

    (साइड नोट: तारांकन आदेश शब्द सीमाओं को जोड़ देगा, जो कि \<और \>कर्सर के नीचे शब्द के आसपास है। यदि आप यह नहीं चाहते हैं, तो g*इसके बजाय उपयोग करें ।)

  2. यह बहुत बेहतर होगा यदि मैं एक कीस्ट्रोके के साथ प्रतिस्थापन की कार्रवाई दोहरा सकता हूं

    आप @:अंतिम विकल्प कमांड को फिर से करने के लिए उपयोग कर सकते हैं । यह अच्छा है अगर आप :sबहुत सारी लाइनों पर एक कमांड करना चाहते हैं, लेकिन उनमें से सभी ऐसा :%sनहीं करेंगे। एक अन्य विकल्प पुष्टि ध्वज है, यानी :%s///gc। यह आपको यह तय करने के लिए टाइप करने yया nप्रत्येक घटना पर अनुमति देगा कि आप इसे बदलना चाहते हैं या नहीं।

    जैसा कि डेस्टी ने बताया , आप &अंतिम विकल्प कमांड को फिर से चलाने के लिए भी कर सकते हैं , लेकिन ध्यान दें कि यह आपके झंडे (जैसे या ) नहीं रखेगा । चाहे वह अच्छा हो या बुरा, आपकी व्यक्तिगत राय पर निर्भर करता है। यदि आप इसका उपयोग करना चाहते हैं, लेकिन क्या यह आपके झंडे भी रखता है, तो आप कर सकते हैंglobalconfirm

    nnoremap & :&&<cr>
    
  3. यदि आप किसी ब्लॉक में होने वाली प्रत्येक घटना को बदलना चाहते हैं, लेकिन फ़ाइल के प्रत्येक मैच को नहीं, तो आप हमेशा ब्लॉक के एक दृश्य चयन का उपयोग कर सकते हैं, जो भर जाएगा

    :'<,'>
    

    आपके विकल्प के लिए, जो आपके द्वारा चुनी गई लाइनों तक सीमित है। जब तारांकन दृष्टिकोण के साथ संयुक्त, मैं यह अत्यंत उपयोगी पाते हैं। इसके अतिरिक्त, यदि आप लाइनों के एक ही ब्लॉक पर एक से अधिक स्थानापन्न कमांड बना रहे हैं, तो आप gvअन्य कमांड को करने के लिए समान लाइनों को पुनः आकार देने के लिए उपयोग कर सकते हैं । (यह :substituteएक सामान्य आदेश है या नहीं)

    यदि आप एक और स्थानापन्न कमांड करते हैं, तो आपको उसी लाइनों को फिर से भरने की आवश्यकता नहीं है , क्योंकि :'<,'> अभी भी उसी लाइनों पर काम किया जाएगा। हालांकि, यह टाइप करने के लिए अधिक सुविधाजनक है

    gv:s
    

    बजाय

    :'<,'>s
    

प्लगइन्स / मैपिंग मुझे पसंद है

  1. मेरे पास निम्नलिखित मानचित्रण हैं, .vimrcजो तारांकन दृष्टिकोण को बढ़ाते हैं ताकि मुझे केवल नया वांछित नाम लिखना पड़े:

    "(R)eplace all
    nnoremap <leader>r yiw:%s/\<<C-r>"\>//g<left><left>
    

    इसका उपयोग करने के लिए, बस अपने कर्सर को उस शब्द पर रखें जिसे आप बदलना चाहते हैं, और टाइप करें <leader>rNewVarName<cr>और आपका काम हो गया। ध्यान दें कि यह आपको पुष्टि करने का विकल्प दिए बिना सभी मैचों को बदल देगा, इसलिए आप इसे उतना पसंद नहीं कर सकते हैं। बेशक, आप इसे बदल सकते हैं

    nnoremap <leader>r yiw:%s/\<<C-r>"\>//gc<left><left><left>
    

    पुष्टि विकल्प के लिए अनुमति देने के लिए।

    संपादित करें : मास के उत्तर और अभिभाषक की टिप्पणी दोनों के बाद , आप इसे भी लिख सकते हैं

    nnoremap <leader>r :%s/\<<C-r><C-w>\>//g<left><left>
    

    जिसे आपके अनाम रजिस्टर को समान रखने का फायदा है।

  2. यदि आप एक ही समय में समान चर के समूहों का नाम बदल रहे हैं, उदाहरण के लिए, बदल रहा है

    fooSuffix
    PrefixFoo
    foo1
    SHOUTINGFOO
    

    सेवा

    barSuffix
    PrefixBar
    bar1
    SHOUTINGBAR
    

    यह उन सभी को व्यक्तिगत रूप से स्थानापन्न करने के लिए एक दर्द हो सकता है। यह वह जगह है जहाँ tpope / vim-abolish काम आता है। आप इन सभी को एक कमांड में बदल सकते हैं:

    :%S/foo/bar/g
    

    और यह आपके लिए पूंजीकरण का ध्यान रखता है।

इनसे आपको बहुत मदद मिल सकती है, लेकिन मुझे बताएं कि क्या इन तरीकों के बारे में कुछ भी है जो आपको पसंद नहीं है या कमी महसूस हो रही है। मैं और अधिक दृष्टिकोणों के बारे में बात करके खुश हूं। :)


अनुशंसित पाठ:


ओह, मैंने यहां कई चीजें सीखीं। अच्छा! एक वैकल्पिक दृष्टिकोण जो आप ले सकते हैं, वह है <leader>rc(या cr) /cइसे अंत में जोड़ना । इसके अलावा, मैंने set gdefaultसेट किया है, क्योंकि मैं लगभग कभी भी एक एकल परिणाम को बदलना नहीं चाहता, इसलिए यह सिर्फ होगा yiw:%s/\<<C-r>"\>//<left><left>
वेन वर्नर

2
क्या शानदार जवाब है!
स्कॉट लुंडबर्ग

2
यदि आप ctrl+r-ctrl+wमैपिंग में उपयोग करते हैं (जैसा कि @Mass द्वारा सुझाया गया है) तो इसे उसी तरह से काम करना चाहिए लेकिन यह आपके यैंक रजिस्टर (जो वांछनीय हो सकता है या नहीं भी हो सकता है) के साथ गड़बड़ी नहीं करेगा
rorkre

1
पाठ के ब्लॉक के साथ काम करते समय याद रखने वाली एक बात जो आप हाइलाइट करते हैं (कटिंग / यांकिंग से पहले) यह है कि आप पिछले हाइलाइट किए गए टेक्स्ट को फिर से हाइलाइट करने के लिए सामान्य मोड में जीवी दर्ज कर सकते हैं।

1
मैंने github.com/hauleth/sad.vim प्लगइन लिखा है जो विधि 2 के समान काम करता है। hovewer आपको .आगे प्रतिस्थापन करने के लिए उपयोग करने की अनुमति देता है ।
हौलेथ

20

c_CTRL-Rनक्शे का परिवार आपके वर्कफ़्लो में काफी सुधार कर सकता है:

  1. उपयोग करते समय आपको चर नाम लिखने की आवश्यकता नहीं है :s/, बस CTRL-R CTRL-Wकर्सर को कमांड लाइन में शब्द सम्मिलित करने के लिए उपयोग करें (कैविएट: यह विशेष वर्णों से बच नहीं करता है, जैसे *कि)।

  2. एक छोटे से बदलाव का उपयोग करने के बाद ce, आप पुराने शब्द का उपयोग करके खोज सकते हैं / CTRL-R -। फिर .परिवर्तन को दोहराने के लिए उपयोग करें।

  3. यदि आपको खोज पैटर्न में बदलाव करने की आवश्यकता है, तो CTRL-R /मौजूदा खोज को कमांड लाइन में रखा जाएगा।

  4. अंत में, आप किसी भी रजिस्टर का उपयोग करके सामग्री डाल सकते हैं CTRL-R {register}


अच्छी बात! मैं हमेशा Ctrl R के बारे में भूल जाता हूं। मैं देखूंगा कि क्या मैं भी इसमें काम कर सकता हूं।
जोएल

2
विशेष रूप से उल्लेख के लायक Ctrl-R /? :sयदि मैं एक खोज शब्द का उपयोग करना चाहता हूं, तो मैं इसे बहुत बार आदेशों में उपयोग करता हूं, लेकिन पिछले एक के समान बिल्कुल नहीं।
अमीर

12

वहाँ कुछ और तरीके हैं (मेरे आश्चर्य के लिए!) अभी तक उल्लेख नहीं किया गया है।

gnकमांड का उपयोग करना

gnnकमांड की तरह काम करता है , सिवाय इसके कि मैच में कूदने के अलावा, यह दृश्य मोड में प्रवेश करता है, जिसमें पूरे मैच का चयन होता है।

तो एक शब्द बदलने के लिए (या कुछ भी आप एक नियमित अभिव्यक्ति के साथ मेल खा सकते हैं!) पहले इसके लिए 1 खोजें , और फिर cgnउस पाठ को दबाएं जिसे आप मैच को बदलना चाहते Escहैं और सामान्य मोड पर लौटना चाहते हैं।

(आप उल्लेख करते हैं कि कभी-कभी आपके द्वारा उपयोग किए जाने वाले प्रतिस्थापन पाठ को "0यैंक रजिस्टर में संग्रहीत किया जाता है - ध्यान दें कि आप इसे Ctrl+R0सम्मिलित रूप से दबाकर इसे फिर से टाइप किए बिना दर्ज कर सकते हैं ।)

आप फिर अगले मैच के लिए कूद सकते हैं और एकल .कीस्ट्रोक के साथ बदलाव को दोहरा सकते हैं !

यदि कोई स्थान है जहाँ आप प्रतिस्थापन नहीं करना चाहते हैं, तो बस unपरिवर्तन को पूर्ववत् करने के लिए दबाएं और अगले मैच पर जाएं।

1: तेजी से, इस तरह के रूप में इस पृष्ठ पर अन्य सुझावों का उपयोग करके *, Ctrl+RCtrl+Wआदि यह भी देखें पीटर Rincker की टिप्पणी कैसे शुरू में अपनी खोज को पॉप्युलेट करने के लिए के बारे में अधिक सुझावों के लिए।

चयन मोड का उपयोग करना

(मुझे यह सबमेन्रेड्रेड पर रोमैनल की पोस्ट से पता चला । मुझे नहीं पता कि उसने खुद इसका आविष्कार किया था या बस इसे पारित कर रहा था।)

चयन मोड दृश्य मोड की तरह एक सा होता है, सिवाय इसके कि यदि आप चयनित पाठ लिखना शुरू करते हैं तो आप जो लिखते हैं उसके साथ तुरंत बदल दिया जाता है (जैसे कि अन्य संपादकों में चयन कैसे काम करता है)।

इस प्रकार आप मैपिंग की इस तिकड़ी का उपयोग बहुत जल्दी ढूंढने / बदलने के लिए कर सकते हैं, जिसे आप आवश्यक होने पर मध्य फ़ाइल में बदल सकते हैं:

nnoremap § *``gn<C-g>
inoremap § <C-o>gn<C-g>
snoremap <expr> . @.

सामान्य मोड मैपिंग : चयनित कर्सर के निकटतम शब्द के साथ मोड का चयन करता है।

फिर आप चयनित शब्द के लिए अपना प्रतिस्थापन टाइप कर सकते हैं और ( बिना दबाए Esc) उपयोग कर सकते हैं:

मोड मैपिंग डालें : अगले मैच में कूदता है और चयन मोड में प्रवेश करता है।

फिर आप एक नया प्रतिस्थापन टाइप कर सकते हैं या .उपयोग करने के लिए दबा सकते हैं:

मोड मैपिंग का चयन करें : पिछले सम्मिलित पाठ को फिर से दर्ज करता है - अनिवार्य रूप से, अंतिम प्रविष्टि को दोहराता है।


मैंने gnअपने उत्तर के अंत में विधि का उल्लेख किया। vi.stackexchange.com/a/13696/488 कल इसके लायक क्या है! आपके उत्तर में हालांकि बहुत अच्छे स्वरूपण हैं।
टैंकरस्मैश

1
@TankorSmash तो आपने किया! ध्यान दें कि मैं कैसे चूक गया। ध्यान दें कि मैं जिस वास्तविक विधि का उपयोग कर रहा हूं, वह आपसे अलग है, हालाँकि (मैं केवल gnएक बार आह्वान करता हूं ), और यह विशिष्ट विधि है, (केवल gnआदेश के बजाय ) जो मुझे आश्चर्य था कि अभी तक उल्लेख नहीं किया गया था।
रिच

मैं होने की सिफारिश करेंगे किसी तरह की "दृश्य स्टार" प्लगइन के साथ उपयोग करने के लिए gn। आपको अधिक खोज विकल्प देता है। गरीब आदमी का दृश्य सितारा मानचित्रण xnoremap * :<c-u>let @/=@"<cr>gvy:let [@/,@"]=[@",@/]<cr>/\V<c-r>=substitute(escape(@/,'/\'),'\n','\\n','g')<cr><cr>:। संबंधित विमकास्ट एपिसोड: gn का उपयोग करके खोज मैचों का संचालन करना
पीटर रिन्कर

1
मैंने प्लगइन sad.vim बनाया है जो इस तरह के प्रवाह में मदद करता है।
हौलेथ

7

प्लगइन https://github.com/terryma/vim-multiple-cursors अधिकांश भाग के लिए इस समस्या का ध्यान रखता है।

मेरा वर्कफ़्लो आमतौर पर इस प्रकार है:

  1. प्रतिस्थापित करने के लिए कर्सर को शब्द पर ले जाएँ।
  2. ctrl-nसब कुछ चुने जाने तक पकड़ें ।
  3. प्रेस cऔर प्रतिस्थापन टाइप करना शुरू करें।

यहां सुविधाजनक बात यह है कि आप केवल खोज-प्रतिस्थापन की तुलना में अधिक जटिल संचालन भी कर सकते हैं, हालांकि मुझे लगता है कि यदि आप इसे बहुत दूर ले जाते हैं, तो प्लगइन कुछ ग्लिट्स दिखाना शुरू कर देता है।


4

उन चीजों को करने का एक और तरीका जो अभी तक उल्लेख नहीं किया गया है: आप कमांड-लाइन विंडो का उपयोग कर सकते हैं ( q:सामान्य मोड में देखें - :help q:अधिक जानकारी के लिए देखें), जिसमें आपके पास विम के स्वतः पूर्णता सुविधाओं ( i_CTRL-N/ i_CTRL-Pऔर विभिन्न i_CTRL-Xअनुक्रमों ) तक पूरी पहुंच है उनके बीच हो रहा है)।

कमांड-लाइन विंडो में आप कमांड लाइन को संपादित करने के लिए सामान्य-मोड कमांड का भी उपयोग कर सकते हैं, उदाहरण के लिए, जिसका अर्थ है कि आप अपने कमांड-लाइन इतिहास में पिछले कमांड के कुछ हिस्सों को यैंक और पेस्ट कर सकते हैं।

ध्यान दें कि इसका उपयोग करते समय आपके कर्सर को कमांड-लाइन विंडो में ले जाया जाएगा, जिसका अर्थ है कि CTRL-R CTRL-Wऔर इसी तरह के तरीके जिसमें कर्सर के नीचे पाठ सम्मिलित करना है, वहां नियमित कमांड लाइन के विपरीत काम नहीं करेगा।


1
आप कमांड-लाइन विंडो भी खोल सकते हैं, जब आप पहले से ही आधे रास्ते :substituteको दबाकर अपनी कमांड दर्ज कर रहे हों<ctrl-f>
रिच

2

इसका समाधान मेरे लिए अन्य उत्तरों के बीच में है:

मान लें कि आपको 6 समान रेखाएँ मिली हैं, और आप मध्य दो में 'सेब' को बदलना चाहते हैं:

I have apples for days
I have apples for days
I have apples for days
I have apples for days
I have apples for days
I have apples for days

मैं क्या करता हूं:

  1. मुझे उस पाठ की शुरुआत करनी है जिसे मैं बदलना चाहता हूं, 'सेब'
  2. vदृश्य मोड में आने के लिए मारो
  3. आखिरी शब्द पर जाएं जिसे मैं बदलना चाहता हूं, इस मामले में कुछ लाइनें 2j
  4. :s/<C-R><C-W>/जो दृश्य चयन का उपयोग सीमा के रूप में :sकरता है, और फिर कर्सर के नीचे शब्द सम्मिलित करता है
  5. मैंने मारा <C-F>जो आपको एक मोड में रखता है जहां आप अपनी कमांड को संपादित कर सकते हैं जैसे कि यह एक बफर था। इसलिए आप जो भी पूर्णता या प्लग इन का उपयोग करना चाहते हैं, उसे प्रतिस्थापन शब्द चुनना चाहते हैं, और आप कर रहे हैं।

सभी एक पंक्ति में, इसके लिए प्रवाह होगा, /apples<CR>2nv/apples<CR>nn:s/<C-R><C-W/oranges<CR>लेकिन यह इससे भी बदतर है।

आपके मामले में, आप जोड़ सकते हैं /cकरने के लिए :sआदेश लोगों को आप नहीं चाहते छोड़, यदि आपका रेंज में कुछ आप छोड़ना चाहते हैं शामिल हैं: :s/<C-R><C-W/orange/c

वैकल्पिक रूप से (और शायद अधिक बस), तो आप पूरे शब्द आप बदलना चाहते, के लिए खोज सकते हैं cयह परिवर्तित करें, तो gnऔर .खोज को दोहरा और एक ही परिवर्तन फिर से लागू करने के लिए। यह /\<apple\><CR>viwcorange<ESC>gn.gn.gn..ngn.तीन पर इसे दोहराना पसंद करेगा , फिर एक उदाहरण छोड़ें, फिर इसे एक आखिरी बार दोहराएं।


जिस विधि का आप अंत में वर्णन करते हैं, वह मेरे लिए काम नहीं करता है (विम 7.4 में, साथ दिया गया vim -Nu NONE)। जब मैं पहली बार प्रेस करता हूं, तो यह भीग जाता है .। किसी भी विचार क्यों है? किसी भी मामले में, इस तरह से बदलाव करने के बजाय और इसके ciwबजाय इसका उपयोग करना सरल होगा । viwngn
अमीर

2

यह पूरी तरह से सवाल से संबंधित नहीं है, लेकिन फिर भी इसे बदलने के लिए शब्द का चयन करने में मदद करनी चाहिए।

वृद्धिशील खोज ( set incsearch) आपको उस शब्द के उपसर्ग को टाइप करने की अनुमति देती है जिसे आपको खोजने की आवश्यकता है, और जैसे ही आप अधिक से अधिक टाइप करते हैं, विम स्वचालित रूप से उपसर्ग की पहली घटना पर कूद जाएगा। यदि आप Enter दबाते हैं और Esc पर छोड़ दिया जाता है, तो खोज की पुष्टि की जाएगी (बाद वाले मामले में कर्सर वापस वहीं जाएगा जहां वह खोज से पहले था)।

हालाँकि, वृद्धिशील खोज एक और उपयोगी सुविधा प्रदान करती है। जब आप पहले से ही किसी शब्द का उपसर्ग टाइप कर लेते हैं और कर्सर सही स्थिति में होता है, <C-L>तो कर्सर के नीचे शब्द से खोज स्ट्रिंग में वर्ण जोड़ने के लिए दबाएँ । यह आपको लगभग कोई कीस्ट्रोक्स के साथ प्रतिस्थापित स्ट्रिंग में प्रवेश करने की अनुमति देता है।

तो, अगर मैं के someOddVariableNameसाथ प्रतिस्थापित करना चाहते हैं evenOdderVariableName, मैं

  1. प्रकार /someOddVऔर आने की घटना पर someOddVariableName;
  2. पूरी तरह से खोज लाइन में दिखाई देने <C-L>तक दबाए रखें someOddVariableName;
  3. खोज की पुष्टि करने के लिए Enter दबाएं;
  4. :%s//evenOdderVariableName/gया जो भी आपको आवश्यक कमांड की जगह ले; आप यहां अन्य उत्तरों का पालन करना चाह सकते हैं।

2

आप चर नाम को पहले बफर में रख सकते हैं ( ywकिसी शब्द को कॉपी करने के लिए), फिर इसे कॉपी :%sकरके चिपकाएँ <C-r>"


2

यदि आप नए (चिपकाए गए) ब्लॉक के भीतर एक चर को बदलना चाहते हैं, तो मेरे पास दो सुझाव हैं:

स्वचालित प्रतिस्थापित

  • नए ब्लॉक की पहली पंक्ति पर जाएं, हिट करें ma। यह किसी स्थान को चिह्नित कर रहा है और उसका नामकरण कर रहा है a

  • नए ब्लॉक की अंतिम पंक्ति पर जाएं, हिट करें mb। अब आपके पास दो नामित स्थान हैं।

  • अब दो लाइनों के बीच की जगह , जैसे :'a,'bs/oldVarName/newVarName/g:।

  • यानी, आपके दो अंकों के बीच की जगह का दायरा है।

मैनुअल तरीका है

  • नए ब्लॉक की पहली पंक्ति पर जाएं।

  • का /oldVarNameपहला उदाहरण खोजने के लिए उपयोग करें oldVarName

  • इसे इस तरह बदलें: cwnewVarName<Esc>जो शब्द को बदलकर newVarNameभागने से बच जाएगा।

  • के nअगले उदाहरण पर जाने के लिए उपयोग करें oldVarName

  • .अंतिम परिवर्तन (यानी दोहराता है cw) को दोहराने के लिए उपयोग करें ।


2

यहां दिए गए अन्य उत्तरों में से कई में पहले से ही ढूंढे गए और बदले हुए वर्कफ़्लो को बेहतर बनाने के तरीकों को शामिल किया गया है, लेकिन मैं टिम पोप द्वारा प्लगइन ab ab..im का उल्लेख करना चाहता था । यह प्रतिस्थापन करता है जहां आप मामलों की एक विस्तृत श्रृंखला को कवर करना चाहते हैं, सामान्य रूप से मामले में भिन्नता के कारण या क्योंकि आपको एक शब्द के एकवचन और बहुवचन दोनों रूपों से निपटने की आवश्यकता है।

:S/child{,ren}/adult{,s}/gसही ढंग से childकरने के लिए adult, Childrenकरने के लिए Adultsऔर CHILDकरने के लिए धर्मान्तरित ADULT

यदि आप ऊंट आवरण शब्दों के साथ काम कर रहे हैं, तो आपको उन राजधानियों को शामिल करने की आवश्यकता है जहाँ आपको मूल और प्रतिस्थापन शब्दों में उनकी आवश्यकता है।

%:S/wordWrap/textBreak/gसही ढंग से दोनों संभालता है wordWrapऔर wordwrap


0

जैसा कि अन्य पहले ही इंगित कर चुके हैं, यदि आपके पास आपका कर्सर आपके शब्द के शीर्ष पर स्थित है, तो आप Ctrl + r कमांडों के परिवार का उपयोग कर सकते हैं, जा रहा है कि Ctrl + r Ctrl + w शायद उपयोग करने के लिए सबसे उपयुक्त है।

हालाँकि, यह विधि केवल एक शब्द (कर्सर के ठीक नीचे) डालने के लिए काम करती है, लेकिन क्या होगा यदि बफर में पाठ के कई हिस्से हैं जिनका हम उपयोग करना चाहते हैं? जैसा कि आप कमांड लाइन में रहते हुए अपने कर्सर को नहीं हिला सकते। ऐसा करने का सबसे अच्छा तरीका यह है कि आपको पाठ के कुछ हिस्सों को कॉपी करना होगा, जिसकी आपको अलग-अलग रजिस्टरों में आवश्यकता होगी, जिसे आप कॉपी करने वाले ऑपरेटर को "{reg_letter} (रजिस्टर से पत्र और उद्धरण) उपसर्ग करके कर सकते हैं। इस तरह से यह संभव होगा। Ctrl + r {reg_letter} के साथ बाद में कमांड लाइन में विभिन्न शब्द डालें। यह थोड़ा अजीब है लेकिन काम करता है।

लेकिन पिछले विचार पर लौटते हुए, यह बहुत अच्छा होगा अगर हम पैटर्न लिखते समय बफर की स्थिति में कर्सर को स्थानांतरित करेंगे। इस तरह हम Ctrl + r Ctrl + w के साथ विभिन्न पदों से पाठ को "पिक" कर सकते हैं, इसलिए मैंने एक प्लगइन बनाया जो कि बस ऐसा करता है: EXtend.vim प्लगइन में प्रतिस्थापन संचालन करने के लिए कई अन्य विशेषताएं भी हैं।

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