मैं विम के कई लाइन के बीच में टेक्स्ट कैसे डाल सकता हूं?


91

कहो कि मेरे पास दस पंक्तियाँ हैं और मैं उन पंक्तियों में होने वाले किसी शब्द के लिए पाठ को प्रस्तुत करना चाहता हूँ? लाइन की शुरुआत में इसका होना जरूरी नहीं है।

से:

sdfsd   foo sdfsd
sfsd    foo fsdf
sdfsdf  foo  sdfsdf

सेवा:

sdfsd   bar(foo sdfsd
sfsd    bar(foo fsdf
sdfsdf  bar(foo  sdfsdf

क्या यह न केवल संभव है, bar(बल्कि वास्तव में चारों ओर fooसे घेरे हुए है bar(foo)?

मैं //कई लाइनों (C- शैली टिप्पणियों) पर टिप्पणियों को जोड़ने का एक त्वरित तरीका भी चाहूंगा ।

मैं Vim / GVim 7.2 का उपयोग करता हूं।


1
C शैली टिप्पणियाँ हैं / * * / BCPL शैली टिप्पणियाँ हैं //
विलियम पर्सल

जवाबों:


169

पहले पर जाएं foo, प्रेस Ctrl- vविजुअल ब्लॉक मोड में प्रवेश करने के लिए और तब तक दबाएं जब तक कि सभी पंक्तियों fooको चिह्नित नहीं किया जाता है। फिर दबाएं Shift- iशुरुआत में डालने के लिए (ब्लॉक का)। जब आप समाप्त कर लें और दबाएं Esc, तो चिन्हित वर्णों को चिह्नित ब्लॉक के बाईं ओर प्रत्येक पंक्ति में जोड़ा जाएगा।

अंत में सम्मिलित करने के लिए, फिर से दबाएं Ctrl- vसभी प्रभावित लाइनों को चिह्नित करने के लिए ऊपर / नीचे जाएं और फिर लाइनों के अंत तक चयन को बढ़ाने Endया दबाने $के लिए। अब आप प्रेस कर सकते हैं Shift- aसभी लाइनों के अंत में संलग्न करने के लिए, जैसे पहले के साथ Shift- i

दृश्य चयन सामान्य आंदोलन कमांड के साथ भी किया जा सकता है। तो सी में एक पूरे ब्लॉक पर टिप्पणी करने के लिए आप शुरुआती ब्रेस और टाइप Ctrl- v % Shift- पर जा सकते हैं i // Esc


5
बस एक अतिरिक्त: यदि Ctrl-V विंडोज पर विम ब्लॉक में दृश्य ब्लॉक मोड शुरू नहीं करता है, तो किसी को इसके बजाय Ctrl-Q का उपयोग करना चाहिए।
पॉल

3
तब उत्तर का एक बदलाव शिफ्ट + वी के साथ दृश्य ब्लॉक को पूर्व मोड में ब्लॉक करने के लिए चिह्नित करना है: '<,'> s / ^ / prexix_text /: '<,'> s / $ / प्रत्यय / नोट "के लिए" <। , जब आप दबाते हैं तो ">" स्वचालित रूप से विम द्वारा मुद्रित होता है: ""।
दिबाला

1
असुविधाओं के लिए विज़ुअल ब्लॉक (Ctrl + V के साथ चिह्न) का उपयोग करें। टिप्पणी साइन "//" वाला एक कॉलम टिप्पणी को हटाने के लिए प्रेस "डी" है। C ++ टिप्पणियों (/ ** /) के बारे में भी मत भूलना :)
dimba

9
लिनक्स में यह ध्यान देने योग्य है कि मुझे सभी लाइनों पर उपसर्ग लगाने से पहले इन्सर्ट मोड से बाहर निकलना पड़ा, और यह एक ऐसी राजधानी है जिसकी मुझे विजुअल मोड से इन्सर्ट मोड में जाने की आवश्यकता है - यानी शिफ्ट + आई, टाइप उपसर्ग, एस्केप, एस्केप।
जोशुआ एनफील्ड

6
यह पोटीन पर काम नहीं करता है। जब मैं दबाता हूं तो iकुछ नहीं होता है। जब मैं दबाता हूं shift+iतो चयन गायब हो जाता है, लेकिन मैं पाठ डालने में सक्षम हूं (वर्तमान स्थान पर जहां कर्सर केवल है)।
जुरगेन पॉल

44

आपके पहले प्रश्न का उत्तर देने के लिए, नीचे

:%s/foo/bar(&)/g

के fooसाथ मिलान पैटर्न के लिए देखो , और चारों ओर जाएगा bar()। यह /gएक पंक्ति में कई बार करेगा।

चूंकि आप सिर्फ मेल कर रहे हैं foo, आप एक सरल कर सकते हैं :s/foo/bar(foo)/g। हालांकि, उपरोक्त कार्य करेगा, यदि आप एक साधारण शब्द (जैसे f[a-z][a-z]) के बजाय एक नियमित अभिव्यक्ति पर मेल करने का निर्णय लेते हैं । उपरोक्त 'और' आपके द्वारा मिलान किए गए का प्रतिनिधित्व करता है।


मैक्रों के साथ मेरा बड़ा लंबा जवाब था। यह आसान तरीका है :-)
ब्रायन रामसे

आप इसे कई लाइनों के लिए कैसे करते हैं? एक व्यावहारिक मामला तब होता है जब आपके पास कोड का एक ब्लॉक होता है जिसमें समान लाइनें होती हैं जिन्हें इस प्रतिस्थापन की आवश्यकता होती है।

यह निश्चित है कि ऐसा लगता है कि यह सभी लाइनों में काम करता है ... ध्यान दें:% s और / g।
ओज्रेक

क्या दिलचस्प है:% s / foo / bar (&) / gc पुष्टि नहीं करता है - 'c' का कोई प्रभाव नहीं है..उग

1
के बीच का पाठ :और यह sनिर्धारित करता है कि यह किस रेखा पर संचालित होता है। कुछ भी नहीं बस वर्तमान लाइन का मतलब है। 1,301 से 30 (समावेशी) लाइनों का मतलब है। '<,'>वर्तमान दृश्य चयन में लाइनों का मतलब है।
१२:१२ बजे रैंप २४'०

17

लाइनों का एक सेट उपसर्ग करने के लिए मैं दो अलग-अलग तरीकों में से एक का उपयोग करता हूं:

एक दृष्टिकोण ब्लॉक सेलेक्ट (sth द्वारा उल्लिखित) है। सामान्य तौर पर, आप ctrl-Vकर्सर-आंदोलन के बाद एक आयताकार क्षेत्र का चयन कर सकते हैं । एक बार जब आप एक आयत पर प्रकाश डालते हैं, तो दबाने shift-Iसे आयत के बाईं ओर वर्ण सम्मिलित होंगे, या shift-Aउन्हें आयत के दाईं ओर जोड़ देगा। इसलिए आप इस तकनीक का उपयोग एक आयत बनाने के लिए कर सकते हैं जिसमें उन लाइनों का बायाँ सबसे स्तंभ शामिल है जिन्हें आप उपसर्ग करना चाहते हैं, हिट करें shift-I, उपसर्ग टाइप करें और फिर हिट से बच जाएँ।

अन्य दृष्टिकोण एक प्रतिस्थापन का उपयोग करना है (जैसा कि ब्रायन एग्न्यू द्वारा उल्लेख किया गया है)। ब्रायन के प्रतिस्थापन पूरे फ़ाइल को प्रभावित करेगा (कमांड में% का अर्थ "सभी लाइनें") है। केवल कुछ पंक्तियों को प्रभावित करने के लिए सबसे आसान तरीका हिट करना है shift-V(जो दृश्य-लाइन मोड को सक्षम करता है) जबकि पहली / आखिरी लाइन पर, और फिर अंतिम / पहली पंक्ति पर जाते हैं। फिर टाइप करें:

:s/^/YOUR PREFIX/

^ एक रेगेक्स है (इस मामले में, लाइन की शुरुआत)। इसे दृश्य रेखा मोड में टाइप करके आप '<,'> को स्वचालित रूप से एस के सामने डाल देंगे। इसका मतलब है कि प्रतिस्थापन की सीमा दृश्य चयन होगी।

अतिरिक्त टिप: यदि आपके उपसर्ग में स्लैश हैं, तो आप उन्हें बैकस्लैश से बच सकते हैं, या आप कमांड में विभाजक के रूप में एक अलग विराम चिह्न चरित्र का उपयोग कर सकते हैं। उदाहरण के लिए, C ++ लाइन टिप्पणियों को जोड़ने के लिए, मैं आमतौर पर लिखता हूं:

:s:^:// :

प्रत्यय जोड़ने के लिए प्रतिस्थापन दृष्टिकोण आम तौर पर आसान होता है जब तक कि आपकी सभी पंक्तियाँ बिल्कुल समान लंबाई की न हों। बस ^ के बजाय पैटर्न के लिए $ का उपयोग करें और आपके स्ट्रिंग को पूर्व-लंबित के बजाय जोड़ा जाएगा।

यदि आप एक साथ एक उपसर्ग और एक प्रत्यय जोड़ना चाहते हैं, तो आप कुछ ऐसा कर सकते हैं:

:s/.*/PREFIX & SUFFIX/

। * पूरी रेखा से मेल खाता है। प्रतिस्थापन में & amp; मिलान किए गए पाठ (पूरी पंक्ति) को वापस डालता है, लेकिन अब इसमें आपका उपसर्ग और प्रत्यय जोड़ा जाएगा।

BTW: कोड की टिप्पणी करते समय आप शायद बाद में इसे अनसुना करना चाहेंगे। आप ctrl-Vस्लैश का चयन करने के लिए दृश्य-ब्लॉक ( ) का उपयोग कर सकते हैं और फिर उन्हें हटाने के लिए डी को हिट कर सकते हैं, या आप shift-Vइस तरह से अग्रणी स्लैश को हटाने के लिए एक प्रतिस्थापन (शायद एक दृश्य रेखा चयन के साथ बनाया गया ) का उपयोग कर सकते हैं :

:s:// ::

6

: बचाव के लिए सामान्य!

:%norm Wibar(

:%norm WEa)

: मानदंड (अल) आज्ञाओं को फिर से बताता है जैसे कि आपने उन्हें टाइप किया था:

डब्ल्यू - अगले शब्द पर जाता है

i - प्रविष्टि मोड शुरू करता है

बार (- अनुक्रम का प्रकार 'बार'

या एक पंक्ति में:

:%norm Wibar(ctrlvESCEa)

यदि आप विंडोज चला रहे हैं तो ctrlqइसके बजाय टाइप करें ctrlv


3

फिर भी एक और संभावना (शायद आपके परीक्षण के मामले में उपयोगी नहीं है, लेकिन अन्य स्थितियों में काम करना) उस क्षेत्र से दूर करना है जिसे आप अंकों के साथ बदलना चाहते हैं।

  • कर्सर को शीर्ष पंक्ति में कहीं भी रखें और दबाएं 'a
  • कर्सर को अंतिम पंक्ति में कहीं भी रखें और दबाएं 'b
  • आदेश जारी करें :'a,'b s/foo/bar(&)/

मुझे आमतौर पर दृश्य ब्लॉक मोड पसंद है अगर स्क्रीन पर सब कुछ दिखाई देता है, और मैं आमतौर पर अंक पसंद करता हूं यदि प्रारंभ और स्टॉप कई स्क्रीन द्वारा अलग हो जाते हैं।


इसके mबजाय 'एक नया मार्कर सेट करना चाहिए । 'एक मौजूदा मार्कर की लाइन पर कूदने के लिए है। `उस मार्कर की लाइन और कॉलम पर कूद जाता है।
तैक्तक

1

एक और सरल नियमित अभिव्यक्ति है:

%s/^/<text you want to prepend>/

0

सी-स्टाइल टिप्पणियों के लिए, ब्रायन द्वारा रेगेक्सप उत्तर का उपयोग करें, और लाइन समाप्त होने पर मिलान करें $, और दूर डालें।

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