विम में स्थानापन्न मामला


154

क्या यह विम में किया जा सकता है?

मेरा क्या मतलब है: 'बैडजॉब' की खोज करना और 'गुडजोब' के स्थान पर निम्न प्रतिस्थापन करना

'badjob' -> 'goodjob'  
'BadJob' -> 'GoodJob'  
'badJob' -> 'goodJob'  
'BADJOB' -> 'GOODJOB'

16
यह एक विम फीचर होना चाहिए। यह काफी हद तक सही है।
बाच

जवाबों:


120

एबोलिड्स का उपयोग करें। रिम :

:%S/badjob/goodjob/g

13
हम टिम पोप के लायक नहीं हैं।
एंड्रयू केटॉन

1
यह प्लगइन मेरे लिए काम नहीं करता है। अगर मुझे एक शब्द पसंद है BadJobऔर मैं इसे बदलना चाहता GoodJobहूं, तो मैं इसका उपयोग नहीं कर सकता %S/badjob/goodjob/g। यह एक मैच का पता लगाने में विफल रहता है।
रॉयमुनसन

@Roymunson आपको यह करने की आवश्यकता है: %S/BadJob/GoodJob/gतो, Subvert कमांड मिश्रित-केस मोड में स्विच हो जाएगा और ओपी द्वारा दिए गए सभी सबस्टेशनों को करेगा।
शिवाम्स

28

मुझे नहीं पता कि यह किस तरह का समाधान है जिसकी आप तलाश कर रहे हैं ... लेकिन मैंने इसका उपयोग किया है: Keepcase.vim

वहाँ कोई समर्थन नहीं है तो विम में ...


11

यकीन है कि आप कर सकते हैं

:s/\cbad/\= strpart(submatch(0), 0 ,1) == toupper(strpart(submatch(0), 0, 1)) ? "GOOD" : "good"/

ps। मैं रख-रखाव का अनुमान लगा रहा हूँ। कुछ इसी तरह के तर्क का सामना करना पड़ता है :)


हाँ यह २००: से होता है:% सब्स्टिट्यूटकैस / \ cbadjob / GoodJob / g ^ ^
ल्यूक हरमिट २३'०

GVim 7.2 के बाद से? मैंने इसे gVim 7.1 (12-मई -2017) में आज़माया और यह काम नहीं करेगा :(
fc।

नहीं, मैंने इसमें जोड़ा है: 2007 में सबस्टीट्यूट कमांड को प्लगइन में। प्लगइन vim.org पर उपलब्ध है, और इसे अधिकांश प्लगइन्स के साथ हमेशा की तरह विम के साथ शिप नहीं किया जाता है।
11

1. यह विफल रहता है जब उपयोगकर्ता है :set ignorecase। 2. के बजाय Badद्वारा प्रतिस्थापित किया GOODजाएगा Good। 3. jobप्रश्न के " " भाग को नजरअंदाज किया जाता है, इसलिए यह भी lambada→ बदल देगा lamgooda। मेरे जवाब में इन बगों और कुछ अन्य चीजों के लिए फ़िक्स और स्पष्टीकरण । (इसके अलावा LOLOWLs!)
हारून थोमा

7

आप इसे केवल पेस्ट कर सकते हैं और इसे अनुकूलित कर सकते हैं:
(बेशक, यदि आप समय-समय पर ऐसा करते हैं, तो आप इस राक्षसी के बजाय एक प्लगइन चाहते हैं। लेकिन कुछ लोगों के लिए जो जल्दी में हैं और केवल एक बार इसकी आवश्यकता है, यह एक त्वरित हैक है अपने चिपकाने की खुशी के लिए :)

:%s/\cbad\zejob/\= ( submatch(0)[0] is# toupper(submatch(0)[0]) ? 'G' : 'g' ) . ( submatch(0)[1] is# toupper(submatch(0)[1]) ? 'OOD' : 'ood' )

खोज पैटर्न के अलावा, आपको प्रतिस्थापन कोड में चार 'तारों को संपादित करना होगा ': भागों को बोल्ड में संपादित करें :

:% s / \ c खराब \ ze जॉब / \
_ (सबमॉच (0) [0] # टॉपर (सबमैच (0) [0]) है? ' G ': ' g '))
(सबमैच (0) [1] # टॉपर है (सबमैच (0) [1])? ' OOD ': ' ood ')

चिपकाने के लिए इस 'नारंगी' संस्करण का उपयोग न करें, क्योंकि इसके लाइनब्रेक वर्ण भी कमांड को तोड़ देंगे।

/\zeसकारात्मक लुकहैड को चिह्नित करने के लिए वीएम रेगेक्स सिंथैटिक शुगर है: इसके बाद के पैटर्न \zeकी जांच की जाती है, लेकिन प्रतिस्थापित नहीं किया जाता है।


is#?? मुझे समझाने दो… (अगर दिलचस्पी है)

#( ==#और अन्य में भी ) केस सेंसिटिविटी को लागू करता है। अन्यथा, :set ignorecase(जो मैं उपयोग करता हूं, क्योंकि यह उपयोगी के लिए आवश्यक है :set smartcase), विम विचार करेगा 'a' == 'A'!!

पागल के रूप में, हमें वास्तव में इसके लिए खाता होना चाहिए: क्योंकि यह उपयोगकर्ता-सेटिंग्स-निर्भर है, ==तो NEVAR का उपयोग किया जाना चाहिए! (जहां छोड़कर वास्तव में वही होगा जो आप चाहते हैं।) मैं ==#पूर्णांक की तुलना करते समय उपयोग करने की सिफारिश का भी पालन करूंगा : http://learnvimscriptthehardway.stevelosh.com/chapters/22.html#code-defensively

is#इसके बजाय ==#रक्षात्मक तरीके से कोडिंग करने का एक और तरीका है: यह प्रकार की सुरक्षा में सुधार करता है: http://google.github.io/styleguide/vimscriptguide.xml?showone=Type_checking#Type_checking
एक स्ट्रिंग शाब्दिक के खिलाफ तुलना करते समय इसका उपयोग किया जाना चाहिए।

'single-quoted'इसके बजाय "double quoted" तार एक और अच्छा अभ्यास हैं: http://google.github.io/styleguide/vimscriptguide.xml?showone=Strings#Strings


एचटी @ एफसी। - इस जवाब उनके बनाता जवाब , कुछ कमियों फिक्सिंग।


4

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

:s/abc/\={'abc':'xyz','Abc':'Xyz'}[submatch(0)]/i

2

रखने की जगह प्लगइन का एक विकल्प स्मार्टकेस है - मूल मामले को रखते हुए शब्दों की जगह । (खराब रेटिंग से खुद को हतोत्साहित न करें।)


1
वहाँ एक चाल को याद करने के लिए कठिन है और कमांड की तरह टाइप करने के लिए कठिन है :%s/file\A\?size/\=SmartCase("LastModifiedTime")/ig?
माइकल हर्टल

@ माइकलहार्ट: आप :SmartCaseकमांड का उपयोग कर सकते हैं । मैंने इसे अपने कांटे में बढ़ाया है । ध्यान दें कि इसके लिए एक निर्भरता के रूप में इंगो-लाइब्रेरी की आवश्यकता है ।
इंगो करकट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.