2012-05-18 14 views
10

कभी-कभी मैं s/search_for/replace_with/options प्रारूप का उपयोग करके विम में खोज और प्रतिस्थापन करना चाहता हूं, लेकिन search_for भाग एक जटिल रेगेक्स बन जाता है जिसे मैं पहली बार सही नहीं कर सकता।विम में प्रभावी रूप से खोज और प्रतिस्थापन कैसे करें "खोज" या "पूर्वावलोकन" खोज भाग से?

मेरे में मेरे .vimrc में set incsearch hlsearch है, इसलिए जब मैं /search_for प्रारूप का उपयोग कर खोज रहा हूं तो विम हाइलाइट करना शुरू कर देगा। यह मेरे regex पहले "परीक्षण"/"पूर्वावलोकन" के लिए उपयोगी है। फिर एक बार जब मैं रेगेक्स चाहता हूं, तो मैं खोज और प्रतिस्थापित करने के लिए s/ पर लागू होता हूं।

लेकिन इस दृष्टिकोण के लिए दो बड़े सीमा है:

  1. यह एक परेशानी कॉपी और regex मैं s/ मोड में / मोड में बनाया चिपकाने के लिए है।
  2. मैं regex (यानी ( और )) में मिलान किए गए समूहों के साथ पूर्वावलोकन नहीं कर सकता या / में जादू मोड \v का उपयोग नहीं कर सकता।

तो आप जटिल रेगेक्स खोज करने और विम में बदलने की कोशिश करते हैं तो आप लोग कैसे हैं?

+0

'/ c' उपयोगी है, मुझे विश्वास है कि मैं चीजों भी बुरी तरह से ऊपर पेंच नहीं किया है)

यह incommand विकल्प सेट सक्षम करने के लिए। – sarnold

+0

मैं इसे प्राप्त करने के लिए "पूर्ववत करें" का उपयोग करता हूं। यदि मेरा खोज पैटर्न खराब है, तो मैं ऑपरेशन को पूर्ववत करता हूं। – jahroy

उत्तर

16

/ के साथ खोज मोड में अपने रेगेक्स का परीक्षण करें, फिर s//new_value/ का उपयोग करें। जब आप s के खोज भाग में कुछ भी पास नहीं करते हैं, तो यह सबसे हालिया खोज लेता है।

जैसा कि @ सैम ब्रिंक भी कहता है, आप खोज रजिस्टर की सामग्री पेस्ट करने के लिए <C-r>/ का उपयोग कर सकते हैं, इसलिए s/<C-r>//new_value/ भी काम करता है। जब आपके पास एक जटिल खोज अभिव्यक्ति हो तो यह अधिक सुविधाजनक हो सकता है।

+0

ठीक है, इसलिए जब मैं '/' के साथ खोज करता हूं, जब मैं // new_value/'करता हूं, तो यह केवल पहले खोजे गए मान को प्रतिस्थापित करता है। यहां तक ​​कि // new_value/g' के साथ भी यह केवल पहले मान को प्रतिस्थापित कर दिया गया है। इसके अलावा मैं इस विधि का उपयोग कर '1 1' और' \ 2' जैसे मिलान किए गए समूह वाले रेगेक्स का उपयोग नहीं कर सकता। – hobbes3

+0

कभी नहीं, @ जोनाथन लेफ्लर के पोस्ट ने मेरे प्रश्न का उत्तर दिया। – hobbes3

6

जैसा कि पहले से ही उल्लेख किया गया है, आप /your-regex-here/ के साथ खोज भाग का अभ्यास कर सकते हैं। जब यह सही तरीके से काम कर रहा है, तो आप नवीनतम खोज का उपयोग करने के लिए s//replacement/ का उपयोग कर सकते हैं।

एक बार ऐसा करने के बाद, आप & का उपयोग अंतिम s/// कमांड को दोहराने के लिए कर सकते हैं, भले ही आपने तब से अलग-अलग खोज की हों। आप मौजूदा लाइन पर वैश्विक रूप से विकल्प करने के लिए :&g का भी उपयोग कर सकते हैं। और आप :.,$&g का उपयोग अन्य संभावनाओं के एक क्षेत्र के बीच (.) और फ़ाइल के अंत ($) के बीच के सभी मैचों पर खोज करने के लिए कर सकते हैं।

यदि आप अपेक्षा करते हैं तो ऑपरेशन काम नहीं करता है, तो भी, आपने पूर्ववत किया है।

+0

यदि यह स्पष्ट नहीं था, तो '1, $, g' प्रत्येक पंक्ति पर प्रतिस्थापन करता है। '1, $' का अर्थ है लाइन 1 से फ़ाइल के अंत तक। – hobbes3

+0

ओह, मुझे अभी पता चला है कि ':%' का मतलब ': 1, $' जैसा है। मैं इसे ':% s/replace/with_this/g' के लिए पहले इसका उपयोग कर रहा हूं, इसका अर्थ यह समझने के बिना कर रहा हूं। – hobbes3

5

जैसा कि अन्य ने ध्यान दिया है कि मैं आमतौर पर s//replacement/ का उपयोग अपनी प्रतिस्थापन करने के लिए करता हूं लेकिन आप खोज रजिस्टर में क्या पेस्ट करने के लिए <C-r>/ का उपयोग कर सकते हैं। तो आप s/<C-r>//replacement/ का उपयोग कर सकते हैं जहां <C-r>/ आपकी खोज पेस्ट करेगा और आप अपने इच्छित अंतिम मिनट के बदलाव कर सकते हैं।

<C-r> एक रजिस्टर की सामग्री को सम्मिलित करता है जहां कर्सर
/ रजिस्टर सबसे हाल ही में खोज पद
:registers रखती है हर रजिस्टर की सामग्री को प्रदर्शित करेगा ताकि आप देख सकते हैं क्या उपलब्ध है।

+0

'सी-आर 'आमतौर पर किसी भी रजिस्टर से पेस्ट कर सकते हैं। – Daenyth

+0

इंगित करने के लिए धन्यवाद, '' के बारे में अतिरिक्त विवरण जोड़े गए –

1

चूंकि नियोविम 0.1.7 वृद्धिशील ("लाइव") है: विकल्प फ़ंक्शन। (तो यह केवल Neovim में काम करता है!

:set inccommand=split 

यह यहाँ घोषणा की गई थी: https://neovim.io/news/2016/11/

संबंधित मुद्दे