विम: एक ही अक्षर को कई लाइनों में सम्मिलित करें


306

कभी-कभी मैं कई लाइनों में पाठ के एक निश्चित दृश्य ब्लॉक को संपादित करना चाहता हूं।

उदाहरण के लिए, मैं एक पाठ लेता हूँ जो इस तरह दिखता है:

name
comment
phone
email

और इसे इस तरह बनाते हैं

vendor_name
vendor_comment
vendor_phone
vendor_email

वर्तमान में जिस तरह से मैं अब यह करूँगा ...

  1. किसी ब्लॉक की सभी 4 पंक्ति पंक्तियों को दबाकर Vऔर फिर jचार बार चुनें।
  2. के साथ इंडेंट किया >
  3. एक पत्र के साथ वापस जाओ h
  4. साथ दृश्य मोड ब्लॉक करने के लिए जाओ Ctrlv
  5. दबाकर चार पंक्तियों का चयन करें jचार बार चार । इस बिंदु पर आपने व्हॉट्सएप के 4x1 दृश्य ब्लॉकों (चार पंक्तियों और एक कॉलम) का चयन किया है।
  6. दबाएँ C । यह एक कॉलम द्वारा बाईं ओर बहुत ज्यादा संकेत दिया।
  7. टाइप ए " vendor_"बिना बोली के । अतिरिक्त स्थान पर ध्यान दें, जिसे हमें वापस रखना था।
  8. प्रेस करें Esc। यह मेरे द्वारा उपयोग किए जाने वाले बहुत कम समय में से एक हैEsc डालने मोड में करने के लिए है। Ctrlcकेवल पहली पंक्ति को संपादित करेगा।
  9. दोहराएँ चरण 1।
  10. दूसरे तरीके से संकेत दें <

अगर शब्दों से पहले व्हाट्सएप का कम से कम एक कॉलम है तो मुझे इंडेंट करने की जरूरत नहीं है। मुझे व्हाट्सएप की जरूरत नहीं होगी, अगर मुझे विजुअल ब्लॉक क्लियर नहीं करना हैc

लेकिन अगर मुझे स्पष्ट करना है, तो क्या मैं इंडेंटेशन के साथ आवश्यक व्हाट्सएप बनाने के बिना ऊपर प्रदर्शन करने का एक तरीका है?

इसके अलावा, एक ही बार में एकाधिक मोड को एडिट करने के लिए Escओवर मोड डालने से बाहर निकल कर काम क्यों करता है Ctrlc?


यहाँ एक और अधिक जटिल उदाहरण है:

name    = models.CharField( max_length = 135 )
comment = models.TextField( blank = True )
phone   = models.CharField( max_length = 135, blank = True )
email   = models.EmailField( blank = True )

सेवा

name    = models.whatever.CharField( max_length = 135 )
comment = models.whatever.TextField( blank = True )
phone   = models.whatever.CharField( max_length = 135, blank = True )
email   = models.whatever.EmailField( blank = True )

इस उदाहरण में, मैं वर्टिकल विज़ुअल ब्लॉक पर प्रदर्शन करूँगा ., और फिर इसे इन्सर्ट मोड, यानी टाइप के दौरान वापस रीस्टोर करूँगा .whatever.। उम्मीद है कि अब आप इस विधि में कमी देख सकते हैं। मैं केवल पाठ के एक स्तंभ का चयन करने के लिए सीमित हूं जो सभी ऊर्ध्वाधर स्थिति में समान हैं


9
बेहतर तरीका: ":% s / ^ / seller_ /"
पॉल

1
जवाब देने के लिए धन्यवाद। यह काम करता है अगर मैं केवल एक शब्द को हर पंक्ति में जोड़ना चाहता हूं। लेकिन मेरे द्वारा उपयोग की जाने वाली विधि किसी भी स्थिति में की जा सकती है। मुझे और अधिक जटिल उदाहरण के साथ अपना उदाहरण जोड़ने दें।
hobbes3

3
फिर उन पंक्तियों को हाइलाइट करें जिन्हें आप शिफ्ट-वी के साथ बदलना चाहते हैं, और एक उपयुक्त खोज टाइप करें और कमांड को बदलें - दूसरे उदाहरण में,:s/models\./\0whatever./
पॉल टॉम्बलिन

उपरोक्त प्राप्त करने के कई तरीके। प्रश्न के सभी भागों का पूरी तरह से उत्तर देने के लिए, भाग 1) या तो रेगेक्स या विजुअल मोड, जो मैं एससीके संपादित करता है, जैसा कि उत्तर में प्रस्तुत किया गया है (मैं जीवीआईएम में दृश्य चयन पसंद करता हूं)। भाग 2 के लिए), मैक्रो शायद सबसे आसान है जैसा कि ब्रायन नील द्वारा प्रस्तुत किया गया है। इन सभी प्रकार के "हाऊ टू ट्स" के लिए मुझे जो सबसे अच्छा संसाधन पता है, वह ड्रू नील द्वारा प्रैक्टिकल विम है। जब भी आप कोई फॉर्मूला भूल जाते हैं तो उत्कृष्ट त्वरित रीड और लाइट वेट संदर्भ। उम्मीद है कि यह सिफारिश किसी की मदद करती है, यह कई विम उपयोगकर्ताओं के लिए प्रयास के लायक होगा।
आर्केल्डन

@Paul: और अगर आपका गिनती कीस्ट्रोक्स , आप बदल सकते \0के साथ &
icktoofay

जवाबों:


912
  1. करने के लिए कर्सर ले जाएँ nमेंname
  2. दृश्य ब्लॉक मोड दर्ज करें (Ctrlv ) ।
  3. jतीन बार दबाएँ (या3j ) ।
  4. दबाएँ I (पूंजी i)।
  5. में टाइप करें vendor_। नोट: यह केवल पहली पंक्ति में स्क्रीन को अपडेट करेगा - जब तकEsc दबाया जाता है (6.), जिस बिंदु पर सभी लाइनें अपडेट की जाएंगी।
  6. प्रेस करें Esc

मिनी-स्क्रैंकास्ट विधि का प्रदर्शन

एक अपरकेस के Iबजाय एक अपरकेस का उपयोग किया जाना चाहिए i, क्योंकि निचले iहिस्से की व्याख्या टेक्स्ट ऑब्जेक्ट के प्रारंभ के रूप में की जाती है, जो अपने आप में उपयोगी है, जैसे टैग ब्लॉक के अंदर चयन करने के लिए ( it):

मिनी-स्क्रेंकास्ट 'इट' टेक्स्ट ऑब्जेक्ट की उपयोगिता दर्शाता है


12
मुझे यह विंडोज में काम करने के लिए नहीं मिल सकता था (क्योंकि क्लिपबोर्ड पेस्ट के लिए CTRL + V मैप किया गया है)। लेकिन Vim ने इसे Windows वर्जन के लिए Ctrl + Q में मैप किया है ।
अर्नस्ट

2
@ वीएन: वीम वास्तव में उस समय के दौरान व्यस्त नहीं है - यह सिर्फ आपके लिए एक और कुंजी दबाने के लिए इंतजार कर रहा है, और अंततः बार बाहर। आपके लिए दो प्रयोग: पहले, भागने की कोशिश करें और फिर तुरंत दूसरी कुंजी दबाएं, जैसे jया ^L। आपको यह देखना चाहिए कि विम आखिर क्यों व्यस्त नहीं था; बस इंतजार था। दूसरा, 'timeout'कम मूल्य में बदलने की कोशिश करें , जैसे 80(डिफ़ॉल्ट के बजाय 1000) और निरीक्षण करें कि यह अधिक तेज़ी से बाहर है।
icktoofay

1
@icktoofay ऐसा लगता है कि आपके द्वारा सेट किया जाने वाला चर timeoutlenनहीं है timeout
jez

4
@ANjaNA: यदि आप जहाँ सम्मिलित करना चाहते हैं, वह सभी एक ही कॉलम में है (जैसे यदि संख्याएँ सभी समान लंबाई की हैं), तो आप एक ही तकनीक का उपयोग कर सकते हैं Aबजाय दबाने के I, जो पहले के बजाय चयनित ब्लॉक के बाद सम्मिलित करेगा। यदि आपकी लाइनें अलग-अलग लंबाई की हैं, हालांकि, यह काम नहीं करेगा; मैं इसके लिए प्रत्येक पंक्ति के अंत से मेल खाते एक प्रतिस्थापन का उपयोग करना पसंद करता हूं, जैसे कुछ पंक्तियों का चयन करना और उपयोग करना :s/$/inserted/
icktoofay

3
मुझे यह काम करने के लिए esc दबाने के बाद नीचे तीर
चलाना पड़ा

69

एक और दृष्टिकोण के साथ संयोजन में .( dot) कमांड का उपयोग करना है I

  1. वह कर्सर ले जाएँ जहाँ आप शुरू करना चाहते हैं
  2. दबाएँ I
  3. आप चाहते हैं उपसर्ग में टाइप करें (जैसे vendor_ )
  4. दबाएँ esc
  5. दबाएँ jएक पंक्ति नीचे जाने के लिए
  6. प्रकार .अंतिम संपादित दोहराने के लिए करें, स्वचालित रूप से फिर से उपसर्ग सम्मिलित करना
  7. वैकल्पिक के बीच जल्दी jऔर.

मुझे लगता है कि यह तकनीक अक्सर छोटी संख्या में परिवर्धन के लिए विजुअल ब्लॉक मोड से अधिक तेज़ होती है और इसमें अतिरिक्त लाभ होता है कि यदि आपको हर एक पंक्ति में टेक्स्ट को एक सीमा में सम्मिलित करने की आवश्यकता नहीं है, तो आप अतिरिक्त दबाकर उन्हें आसानी से छोड़ सकते हैं j की ।

ध्यान दें कि बड़ी संख्या में सन्निहित जोड़ के लिए, ब्लॉक दृष्टिकोण या मैक्रो संभवतः बेहतर होगा।


एक और दृष्टिकोण देखकर अच्छा लगा।
इब्न सईद

मैं इसे केवल कुछ पंक्तियों के लिए पसंद करता हूं। IMO निष्पादित करने के लिए बहुत आसान है।
दान बेहार्ड

आपके द्वारा इच्छित उपसर्ग में टाइप करने के बाद, आपको भागने की कुंजी दबाने की आवश्यकता नहीं है?
Iamnotsam 14

41
  1. उन पंक्तियों का चयन करें जिनका आप उपयोग करके संशोधित करना चाहते हैं CtrlV
  2. दबाएँ:

    • I: चुने जाने से पहले डालें।
    • A: चुने जाने के बाद आवेदन करें।
    • c: जो चुना गया है उसे बदलें।
  3. नया पाठ टाइप करें।

  4. Escसभी चयनित लाइनों में परिवर्तन लागू करने के लिए दबाएँ ।

4
अति उत्कृष्ट! मैं सिर्फ Escअपने जैसे वीआईएम नॉब्स के लिए अंतिम चरण पर प्रकाश डालूंगा - मुझे यह पता लगाने में थोड़ा समय लगा कि बदलाव "बाद में" प्रचारित होंगे!
कीड़े बनी

1
नाइस, "ए" और "सी" विकल्पों के बारे में भी नहीं जानता था।
hobbes3

यह काम क्यों नहीं करता है v? मैं इसके साथ कर सकता हूं Ctrl+V --> A, लेकिन vपाठ का चयन करने के लिए काम नहीं करता है - Aकेवल उस रेखा पर लागू होता है। क्या वे दोनों चयन नहीं हैं? इसके अलावा, बहुत ही अजीब - Aकेवल पंक्ति के अंत में जोड़ता है यदि मैं दृश्य ब्लॉक को रेखा के अंत तक बढ़ाता हूं; अन्यथा यह प्रत्येक पंक्ति के लिए दृश्य ब्लॉक समाप्त होने पर जहाँ कहीं भी लागू होता है। ऐसा लगता है कि यह के बीच एक अंतर को नहीं पहचानता है aऔर A
एलेक्स जी

1
मुझे cइसके बजाय उपयोग करने की आवश्यकता थी C, लेकिन इसने पूरी तरह से ठीक काम किया। धन्यवाद
Tarol

29

मैं अपने कार्यों को रिकॉर्ड करने के लिए एक मैक्रो का उपयोग करूंगा और फिर इसे दोहराऊंगा।

  1. नाम के पहले अक्षर पर अपना कर्सर रखें ।
  2. qqक्ष बफर में रिकॉर्डिंग शुरू करने के लिए मारो ।
  3. iइन्सर्ट मोड में जाने के लिए हिट करें, वेक्टर_ टाइप करें , और फिर Escइंसर्ट मोड को छोड़ने के लिए हिट करें।
  4. अब 0लाइन की शुरुआत में वापस जाने के लिए हिट करें।
  5. अब jनीचे जाने के लिए मारा ।
  6. अब qरिकॉर्डिंग बंद करने के लिए फिर से हिट करें।

अब आपके पास एक अच्छा मैक्रो है।

3@qबाकी लाइनों को करने के लिए अपने मैक्रो को तीन बार निष्पादित करने के लिए टाइप करें।


क्या "क्ष" विशेष ("त्वरित मैक्रो" के लिए?) है?
पीटर मोर्टेंसन

मैक्रो को लगातार कैसे बनाया जा सकता है (कई सत्रों में काम करना)?
पीटर मोर्टेंसन

@PeterMortensen विम में सत्र नामक एक सुविधा है जो बफ़र्स (और अन्य बहुत सारी चीज़ें) को बनाए रखेगा जिसे आप देख सकते हैं।
ब्रायन नील

27
:%s/^/vendor_/

या क्या मैं कुछ न कुछ भूल रहा हूं?


आप इस तथ्य को याद कर रहे हैं कि यह एक फ़ाइल में कई अन्य लाइनों के साथ एक सबटेक्स्ट की संभावना है जिस पर vender_उपसर्ग अवांछित है।
दान बिकार्ड

9
@dan यदि केवल एक सबटेक्स्ट की जरूरत है, तो आप सर्च को लाइन संख्याओं के एक सेट तक सीमित कर सकते हैं, जैसे1,4s/^/vendor_/
ब्रैड कोच

1
@BradKoch दिलचस्प। मुझे लाइन नंबर की बाधाओं के बारे में पता नहीं था, इसके लिए धन्यवाद।
डैन बेहार्ड

8
यह दिलचस्प है, लेकिन क्या अधिक व्यावहारिक है के साथ नेत्रहीन ब्लॉक का चयन करें Vऔर टाइप करें :। यह उस एड एक्सप्रेशन को उपसर्ग करेगा, :'<,'>जिसके साथ एड केवल चयन के लिए लागू होता है:'<,'>s/^/vendor_/
Dolanor

12

अपडेट किया गया जनवरी 2016

जबकि स्वीकृत उत्तर एक महान समाधान है, यह वास्तव में थोड़ा कम कीस्ट्रोक्स है, और स्वीकृत उत्तर पर सिद्धांत रूप में बेहतर है।

  1. करने के लिए कर्सर ले जाएँ nमेंname
  2. दृश्य ब्लॉक मोड दर्ज करें (ctrlv ) ।
  3. दबाएँ 3j
  4. दबाएँ I
  5. में टाइप करें vendor_
  6. प्रेस करें esc

दृश्य चित्रण

ध्यान दें, इसमें प्रदान किए गए उत्तर की तुलना में कम कीस्ट्रोक्स हैं (चरण 3 की तुलना करें)। हम सिर्फ प्रदर्शन करने के लिए j क्रियाओं की संख्या की गिनती करते हैं।

यदि आपके पास पंक्ति संख्याएँ सक्षम हैं (जैसा कि ऊपर सचित्र है), और उस पंक्ति संख्या को जानें जिसे आप स्थानांतरित करना चाहते हैं, तो चरण 3 को # में बदला जा सकता हैG जहाँ # वांछित पंक्ति संख्या है, में है।

ऊपर हमारे उदाहरण में, यह होगा 4G। हालाँकि, जब केवल कुछ पंक्ति संख्याओं के साथ काम करना एक स्पष्ट गिनती अच्छी तरह से काम करती है।


7

मैं एक सर्वर पर कुछ कॉन्फिग फ़ाइल में बहुत सारी लाइनों पर टिप्पणी करना चाहता था जिसमें केवल vi (कोई नैनो) नहीं था, इसलिए दृश्य विधि बोझिल थी और यहां बताया गया है कि मैंने ऐसा कैसे किया।

  1. खुली फाइल vi file
  2. लाइन नंबर प्रदर्शित करें :set number! या:set number
  3. फिर "#" के साथ स्टार्ट-ऑफ-लाइन को बदलने के लिए लाइन नंबर का उपयोग करें, कैसे?

:35,77s/^/#/

नोट: संख्याएँ समावेशी हैं, 35 से 77 तक की लाइनें, दोनों को शामिल किया जाएगा।

असहज करने के लिए / पूर्ववत करें, बस उपयोग करें :35,77s/^#//

यदि आप कोड की प्रत्येक पंक्ति के बाद एक टिप्पणी के रूप में एक पाठ शब्द जोड़ना चाहते हैं, तो आप भी उपयोग कर सकते हैं:

:35,77s/$/#test/ (पायथन जैसी भाषाओं के लिए)

:35,77s/;$/;\/\/test/ (जावा जैसी भाषाओं के लिए)

क्रेडिट / संदर्भ:

  1. /unix/84929/uncommenting-multiple-lines-of-code-specified-by-line-numbers-using-vi-or-vim

  2. /unix/120615/how-to-comment-multiple-lines-at-once


यह मेरे लिए सही समाधान था क्योंकि मैं अक्सर केवल विम-छोटे का उपयोग कर रहा हूं।
JSON C11

7

आपके पास एक उपयोग का मामला भी हो सकता है जहां आप पाठ का एक ब्लॉक हटाना चाहते हैं और इसे बदल सकते हैं।

ऐशे ही

Hello World

Hello World

सेवा

Hello Cool

Hello Cool

आप दोनों लाइनों में "वर्ल्ड" का चयन कर सकते हैं।

cपरिवर्तन के लिए टाइप करें - अब आप इन्सर्ट मोड में होंगे।

अपनी इच्छित सामग्री डालें और बचकर निकलें।

दोनों लंबवत परिलक्षित होते हैं। यह 'I' की तरह ही काम करता है, सिवाय इसके कि यह ब्लॉक को नए पाठ के साथ डालने के बजाय बदल देता है।


6

मान लीजिए कि आपके पास यह फ़ाइल है:

something

name
comment
phone
email

something else
and more ...

आप "विक्रेता" को "नाम", "टिप्पणी", "फोन", और "ईमेल" के सामने जोड़ना चाहते हैं, भले ही वे फ़ाइल में दिखाई दें

:%s/\<\(name\|comment\|phone\|email\)\>/vendor_\1/gc

cझंडा पुष्टि करने के लिए संकेत देगा। यदि आप संकेत नहीं चाहते हैं तो आप इसे छोड़ सकते हैं।


5

एक विकल्प जो अधिक लचीला हो सकता है:

उदाहरण: पंक्ति की शुरुआत में पाठ XYZ दर्ज करने के लिए

:%norm IXYZ

यहाँ क्या हो रहा है?

  • % == प्रत्येक पंक्ति पर निष्पादित करें
  • norm == सामान्य मोड में निम्नलिखित कुंजियों का निष्पादन करें
  • I == लाइन की शुरुआत में डालें
  • XYZ == वह पाठ जिसे आप दर्ज करना चाहते हैं

फिर आप हिट करते हैं Enter, और यह निष्पादित होता है।

आपके अनुरोध के लिए विशिष्ट:

:%norm Ivendor_

आप एक विशेष श्रेणी भी चुन सकते हैं:

:2,4norm Ivendor_

या चयनित दृश्य श्रेणी पर निष्पादित करें:

:'<,'>norm Ivendor_

1
क्या कोई दिलचस्प सामग्री करने के लिए इंसर्ट मोड (जबकि मानक Iabc <ESC>) जैसे प्रमुख अनुक्रम भेजना संभव है?
बैटब्रैट

1
@batbrat मैं अभी यह पता लगा! आप ctrl-v ctrl-[एक "एस्केप एस्क" डालने के लिए हिट कर सकते हैं , जो आपको आपके सामान्य कमांड के उद्देश्य के लिए "सामान्य मोड" पर वापस खींचता है। मैंने अभी इसके साथ परीक्षण किया है '<,'>norm Iaa^[ysiw", जहां ^[बची हुई Esc है।
ऑब्रे

4
Use Ctrl+V to enter visual block mode
Move Up/Down to select the columns of text in the lines you want to comment.
Then hit Shift+i and type the text you want to insert.
Then hit Esc, wait 1 second and the inserted text will appear on every line

क्या यह विधि vim के सभी संस्करणों के लिए काम करती है या किसी भी vim plugins की आवश्यकता है? कारण है कि मैं पूछता हूँ b / c यह कभी-कभी कुछ मशीनों पर काम करता है, लेकिन कभी-कभी ऐसा नहीं होता है। मैं अंतर नहीं समझ सकता। vim जो विंडोज़ पर गिट के साथ आता है - मैं इसे काम नहीं कर सकता। कुछ ubuntu और centos linux मशीनों पर, मैं इसे काम नहीं कर सकता। मुझे कुछ दुर्लभ मामलों में सफलता मिली है, लेकिन मैं सफलता को पुन: पेश नहीं कर सका। यह एक रहस्य है। ईएससी को हिट करने के बाद कुछ भी नहीं लगता है।
davidj411

अजीब बात है, यह अब मेरे लिए काम करता है। कुछ भी नहीं बदला है, शायद सितारों को छोड़कर :) मेरे मुद्दे का हल खोजते समय , मुझे इस पृष्ठ पर कुछ मिला, हालांकि इसमें vim vim.wikia.com/wiki/Inserting_text_in_multi_lines में देखने के लिए कुछ का उल्लेख है , जांचें कि आपके पास क्या है ब्लॉकवाइज-ऑपरेटर्स फीचर: (I, A, और अधिक): वर्जन कमांड दर्ज करके। आउटपुट में + Visualextra शामिल होना चाहिए।
davidj411

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

2
  1. Ctrl दृश्य ब्लॉक मोड में जाने के लिए + v
  2. ऊपर और नीचे तीर का उपयोग कर लाइनों का चयन करें
  3. लोअरकेस दर्ज करें 3i( लोअरकेस दबाएं I तीन बार )
  4. I (प्रेस कैपिटल I । यह आपको इन्सर्ट मोड में ले जाएगा।)
  5. वह पाठ लिखें जिसे आप जोड़ना चाहते हैं
  6. Esc
  7. नीचे तीर दबाएँ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.