विम के साथ आपका सबसे उत्पादक शॉर्टकट क्या है?


1126

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

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

  1. वैकल्पिक रूप से बाएँ और दाएँ हाथ का उपयोग करना कीबोर्ड का उपयोग करने का सबसे तेज़ तरीका है।
  2. माउस को कभी न छूना दूसरा तरीका है जितनी जल्दी हो सके। आपके हाथ को हिलाने, माउस को पकड़ने, उसे हिलाने और कीबोर्ड पर वापस लाने में आपकी उम्र लग जाती है (और आपको अक्सर कीबोर्ड पर गौर करना पड़ता है, ताकि आप सुनिश्चित कर सकें कि आपने अपना हाथ सही जगह पर वापस कर दिया है)

यहाँ दो उदाहरण प्रदर्शित कर रहे हैं कि क्यों मैं विम के साथ बहुत कम उत्पादक हूं।

कॉपी / कट और पेस्ट करें। मुझे हर व़क्त यह करना है। सभी समकालीन संपादकों के Shift साथ आप बाएं हाथ से दबाते हैं , और आप पाठ का चयन करने के लिए अपने दाहिने हाथ से कर्सर को आगे बढ़ाते हैं। फिर Ctrl+ Cकॉपियाँ, आप कर्सर और Ctrl+ Vपेस्ट को स्थानांतरित करते हैं ।

विम के साथ यह भयानक है:

  • yy एक पंक्ति को कॉपी करने के लिए (आप लगभग पूरी लाइन कभी नहीं चाहते हैं!)
  • [number xx]yyxxबफर में लाइनों को कॉपी करने के लिए । लेकिन आपको कभी यह नहीं पता होता है कि आपने जो चुना है, वह आप चाहते हैं। मैं अक्सर क्या करना है [number xx]ddतो uपूर्ववत करने के लिए!

एक और उदाहरण? खोजें और बदलें।

  • में PSPad : Ctrl+ fतो टाइप करें आप के लिए है, तो प्रेस खोज चाहते हैं क्या Enter
  • विम में: /फिर टाइप करें कि आप क्या खोजना चाहते हैं, फिर यदि प्रत्येक विशेष चरित्र के \सामने कुछ विशेष अक्षर रखे जाएं , तो दबाएं ।Enter

और विम के साथ सब कुछ ऐसा है: ऐसा लगता है कि मुझे नहीं पता कि इसे सही तरीके से कैसे संभालना है।

NB: मैं पहले से ही विम धोखा शीट पढ़ा है :)

मेरा सवाल यह है कि:

आपके द्वारा विम का उपयोग करने का तरीका क्या है जो आपको समकालीन संपादक की तुलना में अधिक उत्पादक बनाता है?


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

जवाबों:


2860

विम के साथ आपकी समस्या यह है कि आप vi को नहीं टटोलेंगे ।

आप के साथ काटने का उल्लेख करते हैं yyऔर शिकायत करते हैं कि आप लगभग पूरी रेखाओं को कभी नहीं काटना चाहते हैं। वास्तव में प्रोग्रामर, एडिटिंग सोर्स कोड, बहुत बार पूरी लाइनों, लाइनों की श्रेणी और कोड के ब्लॉक पर काम करना चाहते हैं। हालाँकि, yyअनाम प्रतिलिपि बफ़र (या "रजिस्टर" के रूप में इसे vi में कहा जाता है ) में पाठ को yank करने के केवल कई तरीकों में से एक है ।

Vi का "ज़ेन" यह है कि आप एक भाषा बोल रहे हैं। प्रारंभिक yएक क्रिया है। कथन yyका पर्यायवाची है y_yयह आसान टाइप करने के लिए है, क्योंकि यह इस तरह के एक आम आपरेशन है बनाने के लिए ऊपर दोगुनी है।

इसे भी व्यक्त किया जा सकता है dd P(वर्तमान लाइन को हटा दें और कॉपी को वापस जगह पर चिपका दें; एक कॉपी को साइड इफेक्ट के रूप में अनाम रजिस्टर में छोड़ दें)। yऔर dverbs "" उनके के रूप में किसी भी आंदोलन ले "विषय।" इस प्रकार yW"यंहा से (कर्सर) वर्तमान / अगले (बड़े) शब्द के अंत तक" है और y'a"यंहा से '' a ' नाम के निशान वाली रेखा तक है ।"

यदि आप केवल मूल अप, डाउन, लेफ्ट और राइट कर्सर आंदोलनों को समझते हैं तो vi आपके लिए "नोटपैड" की कॉपी से अधिक उत्पादक नहीं होगा। (ठीक है, आपके पास अभी भी वाक्य रचना हाइलाइटिंग होगी और एक पहेलियों से बड़ी फ़ाइलों को संभालने की क्षमता ~ 45KB या तो; लेकिन मेरे साथ यहां काम करें)।

vi में 26 "अंक" और 26 "रजिस्टर" हैं। mकमांड का उपयोग करके किसी भी कर्सर स्थान पर एक चिह्न सेट किया जाता है । प्रत्येक निशान एक एकल निचले मामले पत्र द्वारा निर्दिष्ट किया गया है। इस प्रकार वर्तमान स्थान maपर ' ' मार्क mzसेट करता है , और ' जेड ' मार्क सेट करता है । आप '(एकल उद्धरण) कमांड का उपयोग करके एक चिह्न वाली रेखा पर जा सकते हैं । इस प्रकार 'aलाइन की शुरुआत में ' ' मार्क होता है। आप `(backquote) कमांड का उपयोग करके किसी भी चिह्न के सटीक स्थान पर जा सकते हैं । इस प्रकार `zसीधे ' z ' चिह्न के सटीक स्थान पर चला जाएगा ।

क्योंकि ये "आंदोलनों" हैं उनका उपयोग अन्य "कथनों" के लिए विषयों के रूप में भी किया जा सकता है।

इसलिए, पाठ के मनमाने ढंग से चयन में कटौती करने का एक तरीका यह होगा कि मैं एक निशान छोड़ दूं (मैं आमतौर पर ' a ' को अपने "पहले" चिह्न के रूप में, ' z ' को अपने अगले चिह्न के रूप में, ' b ' को दूसरे के रूप में और ' e ' को) अभी तक एक और (मुझे याद नहीं है कि vi का उपयोग करने के 15 वर्षों में अंतःक्रियात्मक रूप से चार से अधिक अंक का उपयोग किया गया है ; एक व्यक्ति अपने स्वयं के सम्मेलनों का निर्माण करता है कि मैक्रोज़ द्वारा कैसे अंक और रजिस्टर का उपयोग किया जाता है जो किसी के संवादात्मक संदर्भ को परेशान नहीं करते हैं) फिर हम जाते हैं। हमारे इच्छित पाठ के दूसरे छोर पर; हम या तो अंत में शुरू कर सकते हैं, इससे कोई फर्क नहीं पड़ता। फिर हम बस d`aकाटने या y`aकॉपी करने के लिए उपयोग कर सकते हैं । इस प्रकार पूरी प्रक्रिया में 5 कीस्ट्रोक्स ओवरहेड (छह अगर हम "सम्मिलित करना" शुरू करते हैं। "मोड और जरूरत हैEscबाहर कमांड मोड)। एक बार जब हम कट या कॉपी कर लेते हैं तो कॉपी में चिपकाना एक सिंगल कीस्ट्रोक होता है p:।

मैं कहता हूं कि यह पाठ को काटने या कॉपी करने का एक तरीका है। हालांकि, यह केवल कई में से एक है। बार-बार हम अपने कर्सर को इधर-उधर खिसकाने और निशान छोड़ने के बिना अधिक आसानी से पाठ की सीमा का वर्णन कर सकते हैं। उदाहरण के लिए अगर मैं पाठ मैं उपयोग कर सकते हैं की एक पैरा में हूँ {और }शुरुआत या पैरा के अंत क्रमशः आंदोलनों। इसलिए, पाठ के एक पैराग्राफ को स्थानांतरित करने के लिए मैंने इसे { d}(3 कीस्ट्रोक) का उपयोग करके काटा । (यदि मैं पहले से ही पैराग्राफ की पहली या अंतिम पंक्ति पर होता हूं तो मैं बस d}या d{क्रमशः उपयोग कर सकता हूं ।

"पैराग्राफ" की धारणा कुछ ऐसी चीज़ों से चूक जाती है जो आमतौर पर सहज रूप से उचित होती है। इस प्रकार यह अक्सर कोड के साथ-साथ गद्य के लिए भी काम करता है।

अक्सर हम कुछ पैटर्न (नियमित अभिव्यक्ति) को जानते हैं जो एक छोर या उस पाठ के दूसरे भाग को चिह्नित करता है जिसमें हम रुचि रखते हैं। आगे या पीछे की खोज करना vi में होने वाली हलचलें हैं । इस प्रकार उनका उपयोग हमारे "कथनों" में "विषयों" के रूप में भी किया जा सकता है। तो मैं d/fooवर्तमान लाइन से अगली पंक्ति में कटौती करने के लिए उपयोग कर सकता हूं जिसमें स्ट्रिंग "फू" औरy?bar वर्तमान लाइन से सबसे हाल की (पिछली) लाइन "बार" से कॉपी करना है। यदि मुझे पूरी लाइनें नहीं चाहिए, तो मैं अभी भी खोज आंदोलनों का उपयोग कर सकता हूं (अपने स्वयं के बयानों के रूप में), अपना निशान छोड़ें और `xकमांड का उपयोग करें जैसा कि पहले वर्णित है।

"क्रिया" और "विषय" के अलावा " vi में" वस्तुएं "भी हैं (शब्द के व्याकरणिक अर्थ में)। अब तक मैंने केवल अनाम रजिस्टर के उपयोग का वर्णन किया है। हालाँकि, मैं (डबल उद्धरण संशोधक) के साथ "ऑब्जेक्ट" संदर्भ को उपसर्ग करके 26 "नामित" रजिस्टरों में से किसी का उपयोग कर सकता हूं "। इस प्रकार अगर मैं "addवर्तमान लाइन को ' a ' रजिस्टर में काट रहा हूं और यदि मैं उपयोग करता हूं "by/fooतो मैं पाठ की एक प्रति यहां से अगली पंक्ति में "foo" को ' b ' रजिस्टर में जमा कर रहा हूं । एक रजिस्टर से चिपकाने के लिए मैं बस एक ही संशोधक अनुक्रम के साथ पेस्ट उपसर्ग करता हूं: "ap' a ' रजिस्टर ' की एक प्रति चिपकाता है"bPवर्तमान लाइन से पहले ' b ' से एक कॉपी पेस्ट करता है ।

"उपसर्गों" की यह धारणा व्याकरणिक "विशेषण" और "क्रियाविशेषणों" के एनालॉग्स को भी हमारे पाठ में हेरफेर करती है "भाषा।" अधिकांश आदेश (क्रिया) और आंदोलन (क्रिया या वस्तुएं, संदर्भ के आधार पर) भी संख्यात्मक उपसर्ग ले सकते हैं। इस प्रकार 3Jका अर्थ है "अगली तीन पंक्तियों में शामिल हों" और d5}इसका मतलब है "वर्तमान रेखा से पांचवीं पैराग्राफ के अंत तक यहां से हटाएं।"

यह सभी मध्यवर्ती स्तर vi है । इसमें से कोई भी विम विशिष्ट नहीं है और यदि आप उन्हें सीखने के लिए तैयार हैं तो vi में कहीं अधिक उन्नत चालें हैं। यदि आप केवल इन मध्यवर्ती अवधारणाओं में महारत हासिल करने वाले थे, तो आप शायद पाएंगे कि आपको शायद ही कोई मैक्रोज़ लिखने की आवश्यकता है क्योंकि टेक्स्ट हेरफेर भाषा पर्याप्त रूप से संक्षिप्त है और संपादक की "मूल" भाषा का उपयोग करके आसानी से अधिकांश चीजें करने के लिए अभिव्यंजक है।


अधिक उन्नत चाल का एक नमूना:

कई :आदेश हैं, विशेष रूप से :% s/foo/bar/gवैश्विक प्रतिस्थापन तकनीक। (यह उन्नत नहीं है, लेकिन अन्य :कमांड हो सकता है)। :कमांड का पूरा सेट ऐतिहासिक रूप से एड (लाइन एडिटर) और बाद में एक्स (एक्सटेंडेड लाइन एडिटर) उपयोगिताओं के रूप में vi के पिछले अवतारों द्वारा विरासत में मिला था । वास्तव में vi को इसलिए नाम दिया गया है क्योंकि यह पूर्व की ओर दृश्य इंटरफ़ेस है ।

:आदेश आम तौर पर पाठ की पंक्तियों पर काम करते हैं। एड और पूर्व एक युग में लिखे गए थे जब टर्मिनल स्क्रीन असामान्य थे और कई टर्मिनल "टेलेटाइप" (TTY) उपकरण थे। इसलिए पाठ की मुद्रित प्रतियों से काम करना आम बात थी, एक बेहद ट्रिक इंटरफ़ेस के माध्यम से कमांड का उपयोग करना (सामान्य कनेक्शन गति 110 बॉड थे, या, मोटे तौर पर, 11 वर्ण प्रति सेकंड - जो एक तेज टाइपिस्ट की तुलना में धीमी है; लैग्स सामान्य थे; बहु-उपयोगकर्ता संवादात्मक सत्र; इसके अतिरिक्त कागज संरक्षण के लिए अक्सर कुछ प्रेरणा होती थी)।

तो अधिकांश :कमांड के सिंटैक्स में एक एड्रेस या रेंज ऑफ एड्रेस (लाइन नंबर) शामिल होता है, उसके बाद एक कमांड होता है। स्वाभाविक रूप से एक शाब्दिक लाइन नंबर इस्तेमाल कर सकते हैं: :127,215 s/foo/barप्रत्येक पंक्ति पर "बार" में "foo" की पहली आवृत्ति को बदलने के लिए 127 और 215 के बीच एक भी इस तरह के रूप में कुछ रूपों का उपयोग कर सकता है .या $क्रमश: वर्तमान और पिछले लाइनों के लिए। कोई भी सापेक्ष उपसर्गों का उपयोग कर सकता है +और -क्रमशः वक्र रेखा के बाद या उससे पहले ऑफसेट का उल्लेख कर सकता है। इस प्रकार: :.,$j"वर्तमान लाइन से अंतिम लाइन तक अर्थ, उन सभी को एक पंक्ति में शामिल करें"। (सभी पंक्तियों) :%का पर्याय है :1,$

:... gऔर :... vआदेशों कुछ स्पष्टीकरण सहन के रूप में वे अविश्वसनीय रूप से शक्तिशाली हैं। :... g"ग्लोबली" के लिए एक उपसर्ग है जो सभी लाइनों के लिए एक बाद की कमांड को लागू करता है जो एक पैटर्न (नियमित अभिव्यक्ति) से मेल खाता है, जबकि :... vसभी लाइनों पर ऐसी कमांड लागू होती है जो दिए गए पैटर्न ("v" से "v" से मेल नहीं खाती)। अन्य पूर्व आदेशों के रूप में इन्हें संबोधित / रेंज संदर्भों द्वारा उपसर्ग किया जा सकता है। इस प्रकार :.,+21g/foo/d"अगले 21 लाइनों के माध्यम से स्ट्रिंग" फू "युक्त किसी भी लाइन को हटाएं", जबकि :.,$v/bar/dइसका मतलब है "यहां से फाइल के अंत तक, किसी भी लाइनें को हटाएं, जिसमें स्ट्रिंग" बार नहीं है। "

यह दिलचस्प है कि आम यूनिक्स कमांड grep वास्तव में इस पूर्व कमांड से प्रेरित था (और इसे जिस तरह से प्रलेखित किया गया था उसके नाम पर है)। पूर्व आदेश :g/re/p(ग्रेप) जिस तरह से वे दस्तावेज कैसे "विश्व स्तर पर" "रेगुलर एक्सप्रेशन" (फिर से) "एक युक्त लाइनों" मुद्रित करने के लिए किया गया था। जब एड और एक्स का उपयोग किया जाता था, तो :pकमांड पहले उन में से एक था जिसे किसी ने भी सीखा और अक्सर किसी भी फाइल को संपादित करते समय पहला प्रयोग किया जाता था। यह था कि आपने वर्तमान सामग्रियों को कैसे प्रिंट किया (आमतौर पर :.,+25pइस तरह का उपयोग करते हुए या कुछ समय में केवल एक पृष्ठ भरा हुआ है )।

ध्यान दें कि :% g/.../dया (इसका पुनरीक्षण / विजय प्रतिरूप: :% v/.../dसबसे सामान्य उपयोग पैटर्न हैं। हालाँकि कुछ अन्य exकमांड हैं जो याद रखने योग्य हैं:

हम mलाइनों को स्थानांतरित करने के लिए, और jलाइनों में शामिल होने के लिए उपयोग कर सकते हैं । उदाहरण के लिए, यदि आपके पास एक सूची है और आप सभी सामानों को अलग करना चाहते हैं (या इसके विपरीत कुछ पैटर्न का मिलान नहीं कर रहे हैं) उन्हें हटाए बिना, तो आप कुछ इस तरह का उपयोग कर सकते हैं: :% g/foo/m$... और सभी "फू" लाइनों को स्थानांतरित कर दिया गया होगा फ़ाइल का अंत। (एक खरोंच अंतरिक्ष के रूप में अपनी फ़ाइल के अंत का उपयोग करने के बारे में अन्य टिप पर ध्यान दें)। यह बाकी सूची से निकाले जाने के दौरान सभी "फू" लाइनों के सापेक्ष क्रम को संरक्षित करेगा। (यह कुछ करने के बराबर होगा: 1G!GGmap!Ggrep foo<ENTER>1G:1,'a g/foo'/d(फ़ाइल को अपनी पूंछ पर कॉपी करें, पूंछ को फ़िल्टर करें grep, और सिर से सभी सामग्री को हटा दें)।

लाइनों में शामिल होने के लिए आमतौर पर मुझे उन सभी लाइनों के लिए एक पैटर्न मिल सकता है, जिन्हें उनके पूर्ववर्ती (सभी लाइनें जो "^" के बजाय कुछ बुलेट सूची में "^" से शुरू होने की आवश्यकता होती है, उदाहरण के लिए)। उस स्थिति के लिए मैं उपयोग करूँगा: :% g/^ /-1j(प्रत्येक मिलान रेखा के लिए, एक पंक्ति ऊपर जाएँ और उनसे जुड़ें)। (BTW: बुलेट सूचियों के लिए बुलेट लाइनों के लिए खोज करने की कोशिश कर रहा है और अगले में शामिल होने के लिए कुछ कारणों से काम नहीं करता है ... यह एक बुलेट लाइन से दूसरे में शामिल हो सकता है, और यह सभी के लिए किसी भी बुलेट लाइन में शामिल नहीं होगा इसकी निरंतरता; यह मैचों पर केवल जोड़ीदार काम करेगा)।

उल्लेख करने के लिए लगभग अनावश्यक s( gऔर v/ वैश्विक / वैश्विक) आदेशों के साथ आप हमारे पुराने मित्र (स्थानापन्न) का उपयोग कर सकते हैं । आमतौर पर आपको ऐसा करने की आवश्यकता नहीं होती है। हालांकि, कुछ मामले पर विचार करें जहां आप केवल कुछ अन्य पैटर्न से मेल खाते लाइनों पर प्रतिस्थापन करना चाहते हैं। अक्सर आप कैप्चर के साथ एक जटिल पैटर्न का उपयोग कर सकते हैं और उन लाइनों के हिस्सों को संरक्षित करने के लिए वापस संदर्भ का उपयोग कर सकते हैं जिन्हें आप बदलना नहीं चाहते हैं। हालांकि, अक्सर प्रतिस्थापन से मैच को अलग करना आसान होगा: :% g/foo/s/bar/zzz/g- "ज़ू" के साथ "फू" सभी "बार" स्थानापन्न करने वाली प्रत्येक पंक्ति के लिए। (कुछ इस तरह:% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/gकेवल उन मामलों के लिए काम करेगा जो "बार" के उन उदाहरणों के लिए हैं जो एक ही पंक्ति में "फू" द्वारा संरक्षित थे; यह अनजाने में पहले से ही पर्याप्त है, और सभी मामलों को पकड़ने के लिए आगे बढ़ना होगा, जहां "बार" पूर्ववर्ती "जू")

मतलब नहीं बस की तुलना में अधिक कर रहे हैं वह यह है कि p, s, और dमें लाइनों exकमांड सेट।

:पते भी निशान देख सकते हैं। इस प्रकार आप उपयोग कर सकते हैं: :'a,'bg/foo/jस्ट्रिंग फू युक्त किसी भी लाइन को उसकी बाद की लाइन से जोड़ने के लिए, अगर वह ' a ' और ' b ' निशान के बीच की रेखाओं के बीच स्थित है । (हाँ, पूर्ववर्ती exकमांड के सभी उदाहरण इस प्रकार के संबोधनों के साथ उपसर्ग करके फ़ाइल की पंक्तियों के सबसेट तक सीमित हो सकते हैं)।

यह बहुत अस्पष्ट है (मैंने पिछले 15 वर्षों में कुछ ऐसा ही प्रयोग किया है)। हालांकि, मैं स्वतंत्र रूप से स्वीकार करता हूं कि मैंने अक्सर चीजों को चलने-फिरने और अंतःक्रियात्मक रूप से किया है जो कि संभवत: अधिक कुशलता से किया जा सकता था अगर मैंने सही झुकाव के बारे में सोचने के लिए समय लिया हो।

एक और बहुत उपयोगी vi या पूर्व कमांड :rकिसी अन्य फ़ाइल की सामग्री में पढ़ने के लिए है। इस प्रकार: :r fooवर्तमान पंक्ति में "फू" नामक फ़ाइल की सामग्री सम्मिलित करता है।

अधिक शक्तिशाली :r!कमांड है। यह एक आदेश के परिणाम पढ़ता है। यह vi सत्र को निलंबित करने , कमांड चलाने, अस्थायी फ़ाइल में अपने आउटपुट को पुनर्निर्देशित करने, अपने vi सत्र को फिर से शुरू करने और अस्थायी से सामग्री को पढ़ने के समान है। फ़ाइल।

और भी अधिक शक्तिशाली !(धमाके) और :... !( पूर्व धमाके) आदेश हैं। ये बाहरी आदेशों को भी निष्पादित करते हैं और वर्तमान पाठ में परिणाम पढ़ते हैं। हालाँकि, वे कमांड के माध्यम से हमारे टेक्स्ट के चयन को भी फ़िल्टर करते हैं! इसका उपयोग करके हम अपनी फ़ाइल में सभी पंक्तियों को क्रमबद्ध कर सकते हैं 1G!Gsort( Gयह vi "गोटो" कमांड है; यह फ़ाइल की अंतिम पंक्ति में जाने के लिए डिफॉल्ट करता है, लेकिन एक पंक्ति संख्या, जैसे कि 1, पहली पंक्ति) द्वारा उपसर्ग किया जा सकता है। यह एक्स वेरिएंट के बराबर है :1,$!sort। लेखक अक्सर पाठ के चयन में सुधार या "शब्द रैपिंग" के लिए !यूनिक्स एफएमटी या गुना उपयोगिताओं के साथ उपयोग करते हैं । एक बहुत ही सामान्य मैक्रो है{!}fmt(वर्तमान अनुच्छेद में सुधार)। प्रोग्रामर कभी-कभी इसका उपयोग इंडेंट या अन्य कोड रिफॉर्मरेटिंग टूल्स के माध्यम से अपने कोड को चलाने के लिए करते हैं, या इसके कुछ हिस्सों को ।

:r!और !आदेशों का उपयोग करने का मतलब है कि किसी भी बाहरी उपयोगिता या फ़िल्टर को हमारे संपादक के विस्तार के रूप में माना जा सकता है। मैंने कभी-कभी इनका उपयोग उन लिपियों के साथ किया है जो किसी डेटाबेस से डेटा खींचते हैं, या एक वेबसाइट से डेटा को खींचने वाले wyn या lynx कमांड्स के साथ , या ssh कमांड्स जो रिमोट सिस्टम से डेटा खींचते हैं।

एक अन्य उपयोगी पूर्व कमांड है :so(संक्षिप्त में :source)। यह किसी फ़ाइल की सामग्री को आदेशों की एक श्रृंखला के रूप में पढ़ता है। जब आप vi शुरू करते हैं, तो यह सामान्य रूप से निहित है, एक फ़ाइल :sourceपर प्रदर्शन करता है ~/.exinitrc(और विम आमतौर पर ऐसा करता है ~/.vimrc, स्वाभाविक रूप से पर्याप्त है)। इसका उपयोग यह है कि आप मैक्रो, संक्षिप्त और संपादक सेटिंग्स के एक नए सेट में सोर्सिंग करके अपने एडिटर प्रोफाइल को फ्लाई पर बदल सकते हैं। यदि आप डरपोक हैं, तो आप इसे मांग पर फ़ाइलों पर लागू करने के लिए पूर्व संपादन आदेशों के अनुक्रमों को संग्रहीत करने के लिए एक चाल के रूप में भी उपयोग कर सकते हैं ।

उदाहरण के लिए मेरे पास एक सात लाइन की फाइल (36 अक्षर) है जो एक फाइल को wc के माध्यम से चलाता है , और उस शब्द गणना डेटा वाली फ़ाइल के शीर्ष पर C- शैली टिप्पणी सम्मिलित करता है। मैं एक कमांड का उपयोग करके उस "मैक्रो" को फ़ाइल में लागू कर सकता हूं:vim +'so mymacro.ex' ./mytarget

( Vi और Vim+ को कमांड लाइन विकल्प आमतौर पर एक दिए गए लाइन नंबर पर संपादन सत्र शुरू करने के लिए उपयोग किया जाता है। हालांकि यह थोड़ा ज्ञात तथ्य है कि किसी भी मान्य पूर्व कमांड / अभिव्यक्ति के द्वारा अनुसरण किया जा सकता है , जैसे "स्रोत" कमांड के रूप में। मैंने यहां किया है, एक सरल उदाहरण के लिए मेरे पास स्क्रिप्ट हैं जो आह्वान करती हैं: अपने SSH ज्ञात होस्ट फ़ाइल से एक प्रविष्टि को हटाने के लिए मैं गैर-संवादात्मक रूप से जब मैं सर्वर का एक सेट फिर से इमेजिंग कर रहा हूं)।+vi +'/foo/d|wq!' ~/.ssh/known_hosts

आमतौर पर यह इस तरह के "मैक्रो" पर्ल, AWK, का उपयोग कर लिखने के लिए काफी आसान है sed (जो, वास्तव में, जैसे ग्रेप एक से प्रेरित उपयोगिता एड आदेश)।

@आदेश शायद सबसे अस्पष्ट है vi आदेश। कभी-कभी एक दशक के करीब के लिए उन्नत सिस्टम एडमिनिस्ट्रेशन पाठ्यक्रम पढ़ाने में मैं बहुत कम लोगों से मिला हूं जिन्होंने कभी इसका इस्तेमाल किया है। @एक रजिस्टर की सामग्री को निष्पादित करता है जैसे कि यह एक vi या पूर्व कमांड था।
उदाहरण: मैं अक्सर उपयोग करता हूं: :r!locate ...अपने सिस्टम पर कुछ फ़ाइल खोजने के लिए और उसका नाम मेरे दस्तावेज़ में पढ़ें। वहां से मैं किसी भी बाहरी हिट को हटाता हूं, जिस फ़ाइल में मेरी दिलचस्पी है, उसके लिए केवल पूर्ण पथ छोड़ रहा हूं। Tabपथ के प्रत्येक घटक के माध्यम से श्रमसाध्यता के बजाय (या इससे भी बदतर, अगर मैं टैब पूरा होने के समर्थन के बिना मशीन पर अटक जाता हूं। vi की प्रतिलिपि में ) मैं अभी उपयोग करता हूं:

  1. 0i:r(वर्तमान लाइन को वैध : r कमांड में बदलने के लिए ),
  2. "cdd (लाइन को "सी" रजिस्टर में हटाने के लिए) और
  3. @c उस आदेश पर अमल करें।

यह केवल 10 कीस्ट्रोक्स है (और अभिव्यक्ति "cdd @cप्रभावी रूप से मेरे लिए एक उंगली मैक्रो है, इसलिए मैं इसे लगभग किसी भी सामान्य छह अक्षर के शब्द के रूप में टाइप कर सकता हूं)।


एक साहब ने सोचा

मैंने केवल vi की शक्ति की सतह को खरोंच दिया है और यहां जो कुछ भी मैंने वर्णित किया है, उनमें से कोई भी "सुधार" का हिस्सा नहीं है, जिसके लिए विम का नाम दिया गया है! मैंने यहां जो कुछ भी वर्णित किया है, वे सभी 20 या 30 साल पहले vi की किसी भी पुरानी प्रति पर काम करना चाहिए ।

ऐसे लोग हैं, जिन्होंने मेरी इच्छा से कहीं अधिक vi की शक्ति का उपयोग किया है ।


440
पवित्र कोड बंदर, .. यह एक में गहराई से जवाब है। क्या शानदार है कि आपने लगभग 10 कीस्ट्रोक्स में विम में लिखा है।
अठ्ठारह यूनाइट

48
@Wahnfieden - grok का वास्तव में यही मतलब है: en.wikipedia.org/wiki/Grok (यह जाहिरा तौर पर OED में भी है - निकटतम हम एंजेलोफोन्स में एक कैनोनिकल लेक्सिकॉन है)। "ग्रॉक" करने के लिए एक संपादक को अपने आदेशों का धाराप्रवाह उपयोग करके खुद को ढूंढना है ... जैसे कि वे आपकी प्राकृतिक भाषा थे।
जिम डेनिस

22
वाह, बहुत अच्छा जवाब! मैं अधिक सहमत नहीं हो सकता, हालांकि मैं @कमांड का उपयोग बहुत करता हूं ( qरिकॉर्ड मैक्रो के साथ संयोजन में )
knittl

63
शानदार जवाब जो पूरी तरह से एक बहुत ही भयानक प्रश्न को फिर से परिभाषित करता है। मैं इस सवाल का जवाब देने जा रहा हूं, कि सामान्य तौर पर मैं नीचा दिखाऊंगा, ताकि यह जवाब आसानी से मिल जाए। (और मैं एक Emacs लड़का हूँ! लेकिन इस तरह से मेरे पास नए लोगों को इंगित करने के लिए होगा जो vi पावर उपयोगकर्ताओं को vi के बारे में मज़ेदार लगता है। फिर मैं उन्हें Emacs के बारे में बताऊंगा और वे इसका फैसला कर सकते हैं।)
ब्रैंडन रोड्स

8
क्या आप एक वेबसाइट बना सकते हैं और इस ट्यूटोरियल को वहां रख सकते हैं, इसलिए यह स्टैकओवरफ्लो पर यहाँ नहीं मिलता है। मुझे अभी तक vi से बेहतर परिचय पढ़ना है।
मार्को

504

आप पाठ के चयन और प्रतिलिपि बनाने के बारे में बात कर रहे हैं, मुझे लगता है कि आपको Vim Visual Mode को देखना चाहिए ।

दृश्य मोड में, आप विम कमांड्स का उपयोग करके पाठ का चयन करने में सक्षम हैं, फिर आप जो चाहें चयन के साथ कर सकते हैं।

निम्नलिखित सामान्य परिदृश्यों पर विचार करें:

आपको अगले मिलान कोष्ठक का चयन करने की आवश्यकता है।

तुम यह कर सकते थे:

  • v% यदि कर्सर कोष्ठक के आरंभ / समाप्ति पर है
  • vib यदि कोष्ठक कोष्ठक के अंदर है

आप उद्धरणों के बीच पाठ का चयन करना चाहते हैं:

  • vi " दोहरे उद्धरण चिह्नों के लिए
  • vi ' एकल उद्धरण के लिए

आप एक घुंघराले ब्रेस ब्लॉक (सी-स्टाइल भाषाओं पर बहुत ही सामान्य) का चयन करना चाहते हैं:

  • viB
  • vi{

आप संपूर्ण फ़ाइल का चयन करना चाहते हैं:

  • ggVG

विजुअल ब्लॉक सिलेक्शन एक और बहुत ही उपयोगी फीचर है, यह आपको टेक्स्ट के एक आयताकार क्षेत्र का चयन करने की अनुमति देता है, आपको बस इसे प्रेस करना है Ctrl- Vऔर इसे शुरू करने के लिए, और फिर आप जिस टेक्स्ट ब्लॉक का चयन करना चाहते हैं, जैसे कि यांक, हटाएं, पेस्ट, एडिट, आदि कॉलम ओरिएंटेड टेक्स्ट को एडिट करना बहुत अच्छा है ।


2
प्रत्येक संपादक के पास कुछ ऐसा होता है, यह विशेष के लिए विशिष्ट नहीं है।
फाइनेंशियल

22
हां, लेकिन यह पोस्टर की एक विशिष्ट शिकायत थी। विजुअल मोड विम के प्रत्यक्ष पाठ-चयन और हेरफेर का सबसे अच्छा तरीका है। और चूंकि vim के बफर ट्रैवर्सल तरीके शानदार हैं, इसलिए मुझे vim में पाठ चयन काफी आनंददायक लगता है।
बंदूकें

9
मुझे लगता है कि यह ब्लॉक का चयन करने के लिए Ctrl-V का उल्लेख करने के लायक है - यानी पाठ की एक मनमानी आयत। जब आपको इसकी आवश्यकता होती है तो यह एक जीवनरक्षक है।
हमीश डाउनर

6
@viksit: मैं Camtasia का उपयोग कर रहा है, लेकिन विकल्प के बहुत सारे हैं: codinghorror.com/blog/2006/11/screencasting-for-windows.html
सीएमएस

3
इसके अलावा, यदि आपको एक दृश्य चयन मिल गया है और इसे समायोजित करना चाहते हैं, oतो दूसरे छोर पर चले जाएंगे। इसलिए आप चयन की शुरुआत और अंत दोनों को जितना चाहें उतना आगे बढ़ा सकते हैं।
नाथन लॉन्ग

207

कुछ उत्पादकता सुझाव:

स्मार्ट आंदोलनों

  • *और #आगे / पीछे कर्सर के नीचे शब्द खोजें।
  • w अगले शब्द के लिए
  • W अगले अंतरिक्ष-अलग शब्द के लिए
  • b/ eवर्तमान शब्द के आरंभ / अंत तक। ( B/ Eकेवल स्पेस द्वारा पृथक के लिए)
  • gg/ Gफ़ाइल के आरंभ / अंत में कूदें।
  • % मैचिंग {..} या (..), आदि पर जाएं।
  • {/ }अगले पैराग्राफ पर जाएं।
  • '. अंतिम संपादित पंक्ति पर वापस जाएं।
  • g; पिछले संपादित स्थिति पर वापस जाएं।

त्वरित संपादन आदेश

  • I शुरुआत में डालें।
  • A समाप्त करने के लिए अपील।
  • o/ Oकरंट के पहले / बाद में एक नई लाइन खोलें।
  • v/ V/ Ctrl+Vदृश्य मोड (पाठ का चयन करने के लिए!)
  • Shift+R पाठ बदलें
  • C लाइन के शेष भाग को बदलें।

आज्ञाओं का मेल

अधिकांश कमांड उदाहरण के लिए एक राशि और दिशा स्वीकार करते हैं:

  • cW = शब्द के अंत तक बदल जाते हैं
  • 3cW = 3 शब्द बदलें
  • BcW = पूरा शब्द शुरू करने के लिए, पूरा शब्द बदलें
  • ciW = आंतरिक शब्द बदलें।
  • ci" = ".." के बीच आंतरिक परिवर्तन
  • ci( = (के बीच पाठ बदलें)
  • ci< = <..> (जरूरतों के बीच पाठ बदलें) set matchpairs+=<:> vimrc में )
  • 4dd = 4 लाइनें हटाएं
  • 3x = 3 वर्ण हटाएं।
  • 3s = स्थानापन्न 3 वर्ण।

उपयोगी प्रोग्रामर कमांड

  • rएक वर्ण बदलें (जैसे rdवर्तमान वर्ण को बदलता है d)।
  • ~ परिवर्तन का मामला।
  • J दो लाइनों में मिलती है
  • Ctrl + A / Ctrl + X वेतन वृद्धि / गिरावट।
  • . अंतिम कमांड दोहराएं (एक साधारण मैक्रो)
  • == फिक्स लाइन इंडेंट
  • > इंडेंट ब्लॉक (विज़ुअल मोड में)
  • < unindent block (विजुअल मोड में)

मैक्रो रिकॉर्डिंग

  • q[ key ]रिकॉर्डिंग शुरू करने के लिए दबाएं ।
  • फिर qरिकॉर्डिंग बंद करने के लिए मारा ।
  • मैक्रो के साथ खेला जा सकता है @[ key ]

बहुत विशिष्ट आदेशों और आंदोलनों का उपयोग करके, VIM अगली पंक्तियों के लिए उन सटीक कार्यों को फिर से कर सकता है। (उदाहरण के लिए ए-अप-टू-एंड, b/ eकर्सर को क्रमशः किसी शब्द के आरंभ या अंत में ले जाने के लिए)

अच्छी तरह से निर्मित सेटिंग्स का उदाहरण

# reset to vim-defaults
if &compatible          # only if not set before:
  set nocompatible      # use vim-defaults instead of vi-defaults (easier, more user friendly)
endif

# display settings
set background=dark     # enable for dark terminals
set nowrap              # dont wrap lines
set scrolloff=2         # 2 lines above/below cursor when scrolling
set number              # show line numbers
set showmatch           # show matching bracket (briefly jump)
set showmode            # show mode in status bar (insert/replace/...)
set showcmd             # show typed command in status bar
set ruler               # show cursor position in status bar
set title               # show file in titlebar
set wildmenu            # completion with menu
set wildignore=*.o,*.obj,*.bak,*.exe,*.py[co],*.swp,*~,*.pyc,.svn
set laststatus=2        # use 2 lines for the status bar
set matchtime=2         # show matching bracket for 0.2 seconds
set matchpairs+=<:>     # specially for html

# editor settings
set esckeys             # map missed escape sequences (enables keypad keys)
set ignorecase          # case insensitive searching
set smartcase           # but become case sensitive if you type uppercase characters
set smartindent         # smart auto indenting
set smarttab            # smart tab handling for indenting
set magic               # change the way backslashes are used in search patterns
set bs=indent,eol,start # Allow backspacing over everything in insert mode

set tabstop=4           # number of spaces a tab counts for
set shiftwidth=4        # spaces for autoindents
#set expandtab           # turn a tabs into spaces

set fileformat=unix     # file mode is unix
#set fileformats=unix,dos    # only detect unix file format, displays that ^M with dos files

# system settings
set lazyredraw          # no redraws in macros
set confirm             # get a dialog when :q, :w, or :wq fails
set nobackup            # no backup~ files.
set viminfo='20,\"500   # remember copy registers after quitting in the .viminfo file -- 20 jump links, regs up to 500 lines'
set hidden              # remember undo after quitting
set history=50          # keep 50 lines of command history
set mouse=v             # use mouse in visual mode (not normal,insert,command,help mode


# color settings (if terminal/gui supports it)
if &t_Co > 2 || has("gui_running")
  syntax on          # enable colors
  set hlsearch       # highlight search (very useful!)
  set incsearch      # search incremently (search while typing)
endif

# paste mode toggle (needed when using autoindent/smartindent)
map <F10> :set paste<CR>
map <F11> :set nopaste<CR>
imap <F10> <C-O>:set paste<CR>
imap <F11> <nop>
set pastetoggle=<F11>

# Use of the filetype plugins, auto completion and indentation support
filetype plugin indent on

# file type specific settings
if has("autocmd")
  # For debugging
  #set verbose=9

  # if bash is sh.
  let bash_is_sh=1

  # change to directory of current file automatically
  autocmd BufEnter * lcd %:p:h

  # Put these in an autocmd group, so that we can delete them easily.
  augroup mysettings
    au FileType xslt,xml,css,html,xhtml,javascript,sh,config,c,cpp,docbook set smartindent shiftwidth=2 softtabstop=2 expandtab
    au FileType tex set wrap shiftwidth=2 softtabstop=2 expandtab

    # Confirm to PEP8
    au FileType python set tabstop=4 softtabstop=4 expandtab shiftwidth=4 cinwords=if,elif,else,for,while,try,except,finally,def,class
  augroup END

  augroup perl
    # reset (disable previous 'augroup perl' settings)
    au!  

    au BufReadPre,BufNewFile
    \ *.pl,*.pm
    \ set formatoptions=croq smartindent shiftwidth=2 softtabstop=2 cindent cinkeys='0{,0},!^F,o,O,e' " tags=./tags,tags,~/devel/tags,~/devel/C
    # formatoption:
    #   t - wrap text using textwidth
    #   c - wrap comments using textwidth (and auto insert comment leader)
    #   r - auto insert comment leader when pressing <return> in insert mode
    #   o - auto insert comment leader when pressing 'o' or 'O'.
    #   q - allow formatting of comments with "gq"
    #   a - auto formatting for paragraphs
    #   n - auto wrap numbered lists
    #   
  augroup END


  # Always jump to the last known cursor position. 
  # Don't do it when the position is invalid or when inside
  # an event handler (happens when dropping a file on gvim). 
  autocmd BufReadPost * 
    \ if line("'\"") > 0 && line("'\"") <= line("$") | 
    \   exe "normal g`\"" | 
    \ endif 

endif # has("autocmd")

सेटिंग्स का उपयोग करके ~/.vimrcया /etc/vimrc.localउसके बाद सिस्टम-वाइड में संग्रहित किया जा सकता है और /etc/vimrcफ़ाइल का उपयोग करके पढ़ा जा सकता है :

source /etc/vimrc.local

(आपको वीआईएम में काम करने के लिए #टिप्पणी चरित्र को बदलना होगा ", मैं यहां हाइलाइटिंग उचित सिंटैक्स देना चाहता था)।

मैंने यहां जो कमांड सूचीबद्ध किए हैं, वे बहुत बुनियादी हैं, और मुख्य मैं अब तक का उपयोग करता हूं। वे पहले से ही मुझे बहुत अधिक उत्पादक बनाते हैं, बिना सभी फैंसी सामान को जानने के लिए।


4
से बेहतर '.है g;, जो पीछे से कूदता है changelist। अंतिम संपादित पंक्ति के बजाय अंतिम संपादित स्थिति पर जाता है
n

98

Control+ Rतंत्र बहुत उपयोगी है :-) में या तो मोड डालने या आदेश मोड (पर यानी :, एक गिने या नामित रजिस्टर के साथ जारी रखने लाइन जब टाइपिंग आदेशों):

  • a- zनामित नाम
  • " अनाम रजिस्टर, जिसमें अंतिम डिलीट या यान का टेक्स्ट है
  • % वर्तमान फ़ाइल का नाम
  • # वैकल्पिक फ़ाइल नाम
  • * क्लिपबोर्ड सामग्री (X11: प्राथमिक चयन)
  • + क्लिपबोर्ड सामग्री
  • / अंतिम खोज पैटर्न
  • : अंतिम कमांड-लाइन
  • . अंतिम सम्मिलित पाठ
  • - अंतिम छोटा (एक पंक्ति से कम) हटाएं
  • =5*5 पाठ में 25 डालें (मिनी-कैलकुलेटर)

अधिक CTRL-R अच्छाई के लिए देखें :help i_CTRL-Rऔर :help c_CTRL-Rअधिक जानकारी के लिए, और पास में स्नूप करें।


10
FYI करें, यह इन्सर्ट मोड में Ctrl + R को संदर्भित करता है । सामान्य मोड में, Ctrl + R फिर से होता है।
vdboor

2
वर्तमान / वैकल्पिक फ़ाइल नाम के लिए +1। Control-Aअंतिम सम्मिलित पाठ के लिए सम्मिलित मोड में भी काम करता है, और अंतिम सम्मिलित पाठ Control-@को सम्मिलित करने के लिए और तुरंत सामान्य मोड में स्विच करता है।
आर्येह लीब तौआरोग

91

विम प्लग

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

rails.vim

Rails.vim tpope द्वारा लिखा गया एक प्लगइन है। यह रेल विकास कर रहे लोगों के लिए एक अविश्वसनीय उपकरण है। यह जादुई संदर्भ-संवेदनशील चीजें करता है जो आपको एक नियंत्रक से एक विधि से संबंधित दृश्य में, एक मॉडल पर, और उस मॉडल के लिए यूनिट परीक्षणों के लिए आसानी से कूदने की अनुमति देता है। यदि रेल डेवलपर के रूप में सैकड़ों घंटे नहीं तो दर्जनों की बचत हुई।

gist.vim

यह प्लगइन आपको दृश्य मोड में पाठ के एक क्षेत्र का चयन करने की अनुमति देता है और इसे gist.github.com पर पोस्ट करने के लिए एक त्वरित कमांड टाइप करता है । यदि आप IRC या IM में किसी व्यक्ति के साथ सहयोग कर रहे हैं, तो यह आसान पेस्टिबिन पहुंच की अनुमति देता है।

space.vim

यह प्लगइन स्पेसबार को विशेष कार्यक्षमता प्रदान करता है। यह स्पेसबार को अवधि के अनुरूप कुछ में बदल देता है, लेकिन कार्रवाई को दोहराने के बजाय यह गति को दोहराता है। यह एक तरह से फ़ाइल के माध्यम से तेज़ी से आगे बढ़ने के लिए बहुत आसान हो सकता है, जिस पर आप मक्खी को परिभाषित करते हैं।

surround.vim

यह प्लगइन आपको पाठ के साथ काम करने की क्षमता देता है जो कुछ फैशन में सीमांकित है। यह आपको ऐसी वस्तुएं देता है जो पार्न्स के अंदर चीजों को दर्शाती हैं, उद्धरणों के अंदर की चीजें, आदि। यह सीमांकित पाठ में हेरफेर के लिए काम में आ सकती है।

supertab.vim

यह स्क्रिप्ट फैंसी टैब पूरा करने की कार्यक्षमता लाता है। स्वतः पूर्ण सामग्री पहले से ही विम के मूल में है, लेकिन यह कई अलग-अलग मल्टीकेयर शॉर्टकट्स के बजाय एक त्वरित टैब पर लाता है। उपयोग करने के लिए बहुत आसान और अविश्वसनीय रूप से मज़ेदार। हालांकि यह वी.एस. के अंतर्मुखी नहीं है, यह एक शानदार कदम है और एक कार्यक्षमता का एक बड़ा सौदा लाता है जिसे आप टैब पूरा करने वाले टूल से अपेक्षा करना चाहते हैं।

syntastic.vim

यह टूल बाहरी सिंटैक्स चेकिंग कमांड्स को विम में लाता है। मैंने व्यक्तिगत रूप से इसका उपयोग नहीं किया है, लेकिन मैंने इसके बारे में बहुत अच्छी बातें सुनी हैं और अवधारणा को हरा पाना कठिन है। सिंटैक्स की जांच मैन्युअल रूप से करने के बिना यह एक महान समय बचाने वाला है और आपको सिंटैक्टिक बग्स को पकड़ने में मदद कर सकता है क्योंकि आप उन्हें पेश करने के बजाय जब आप अंततः परीक्षण करना बंद कर देते हैं।

fugitive.vim

विम के अंदर से गिट तक सीधी पहुंच। दोबारा, मैंने इस प्लगइन का उपयोग नहीं किया है, लेकिन मैं उपयोगिता देख सकता हूं। दुर्भाग्य से मैं एक ऐसी संस्कृति में हूं जहां svn को "नया" माना जाता है, इसलिए मुझे संभवतः कुछ समय के लिए काम पर गिट नहीं दिखाई देगा।

nerdtree.vim

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

FuzzyFinderTextmate.vim

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

निष्कर्ष

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

धन्यवाद

अपने vim config के लिए duwanis के लिए धन्यवाद , जिससे मैंने बहुत कुछ सीखा है और यहां सूचीबद्ध अधिकांश प्लगइन्स को उधार लिया है।


पटरियों में जादुई परीक्षण-टू-क्लास नेविगेशन ।vim अधिक सामान्य चीजों में से एक है जो मैं चाहता हूं कि विम के पास सभी भाषाओं में TextMate बिल्कुल नाखून हैं: अगर मैं Person.scala पर काम कर रहा हूं और मैं Cmd + T करता हूं, तो आमतौर पर पहली चीज सूची में PersonTest.scala है।
टॉम मॉरिस

5
मुझे लगता है कि यह समय है FuzzyFinderTextmate ने github.com/wincent/Command-T
Gavin Gilmour

2
सिंथेटिक के लिए +1। कि, JSLint के साथ संयुक्त, मेरे जावास्क्रिप्ट बहुत कम त्रुटि-प्रवण बना दिया है। Syntastic के साथ काम करने के लिए JSLint कैसे सेट करें, इसके बारे में superuser.com/questions/247012/… देखें ।
नाथन लॉन्ग

1
@ बेंसन महान सूची! मैं स्निपमेट में भी टॉस करूंगा । आम कोडिंग सामान का बहुत उपयोगी स्वचालन। अगर <tab> तुरंत अगर ब्लॉक, आदि
Alg

2
मुझे लगता है कि nerdcommenter भी एक अच्छा प्लगइन है: यहाँ । जैसा कि इसका नाम कहता है, यह आपके कोड पर टिप्पणी करने के लिए है।
Stephan

53

. अंतिम पाठ बदलने वाली कमांड दोहराएं

मैं इस एक के साथ बहुत समय बचाता हूं।

दृश्य मोड का पहले उल्लेख किया गया था, लेकिन पाठ फ़ाइल में निश्चित आकार के कॉलम को संपादित करते समय ब्लॉक दृश्य मोड ने मुझे बहुत समय बचाया है। (Ctrl-V के साथ एक्सेस किया गया)।


3
इसके अतिरिक्त, यदि आप पाठ को संपादित करने के लिए एक संक्षिप्त आदेश (उदाहरण के लिए एपेंड-एट-एंड के लिए) का उपयोग करते हैं, तो विम अगली .कुंजी के लिए उसी सटीक कार्रवाई को दोहरा सकता है जिसे आप कुंजी दबाते हैं ।
vdboor

48

गी

अंतिम संपादित स्थान पर जाएं (बहुत उपयोगी है अगर आपने कुछ खोज की और संपादित करने के लिए वापस जाना चाहते हैं)

^ पी और ^ एन

पिछला (^ P) या अगला (^ N) पाठ पूरा करें।

^ O और ^ I

पिछले ( ^O- "O"पुराने) स्थान के लिए या अगले ( ^I- "I"बस के पास "O") पर जाएं। जब आप खोज करते हैं, फ़ाइलों को संपादित करते हैं, आदि, आप इन "कूद" के माध्यम से आगे और पीछे नेविगेट कर सकते हैं।


4
@ कुंगी `। आपको अंतिम संपादन में ले जाएगा `` आपको उस स्थिति में वापस ले जाएगा जो आप पिछले 'जंप' से पहले थे - जो कि अंतिम संपादन की स्थिति हो सकती है।
मैकलेन

46

मैंने हाल ही में इस साइट की खोज की: http://vimcasts.org/

यह बहुत नया है और वास्तव में वास्तव में अच्छा है। वह व्यक्ति जो साइट चला रहा है, टेक्स्टमेट से विम पर स्विच करता है और विशिष्ट विम विषयों पर बहुत अच्छे और संक्षिप्त कलाकारों को होस्ट करता है। इसकी जांच - पड़ताल करें!


3
यदि आप विम ट्यूटोरियल पसंद करते हैं, तो डेरेक व्याट के वीडियो को भी देखें। वे बेहतरीन हैं।
जेरोमे एंग्लीम

42

CTRL+A जिस नंबर पर आप खड़े हैं, उसे बढ़ाएँ।


19
... और CTRL-X वेतन वृद्धि।
इन्नाएम

9
यह एक साफ-सुथरा शॉर्टकट है, लेकिन अभी तक मुझे इसके लिए कोई फायदा नहीं मिला है।
SolutionYogi

8
यदि आप स्क्रीन में विम चलाते हैं और आश्चर्य करते हैं कि यह काम क्यों नहीं करता है - ctrl + A, A
matja

13
@SolutionYogi: विचार करें कि आप प्रत्येक पंक्ति के आरंभ में पंक्ति संख्या जोड़ना चाहते हैं। हल: ggI1 <space> <esc> 0qqyawjP0 <ca> 0q9999 @ q
hcs42

10
Vimperator के साथ अत्यंत उपयोगी है, जहां यह URL में अंतिम संख्या बढ़ाता है (या घटाता है, Ctrl-X)। छवि दीर्घाओं आदि के माध्यम से जल्दी से सर्फिंग के लिए उपयोगी
ब्लूएड

38

सभी सामान्य मोड में:

f <char> वर्तमान लाइन पर किसी विशेष वर्ण के अगले उदाहरण पर जाने के लिए, और ; दोहराना।

F <char> वर्तमान लाइन पर किसी विशेष वर्ण के पिछले उदाहरण पर जाने के लिए और ; दोहराना।

यदि समझदारी से उपयोग किया जाता है, तो उपरोक्त दोनों आपको एक पंक्ति में हत्यारे-त्वरित गति से आगे बढ़ सकते हैं।

* अगले उदाहरण के लिए खोज करने के लिए एक शब्द पर।

# पिछले उदाहरण को खोजने के लिए एक शब्द पर।


6
वाह, मैं * और # (कर्सर के नीचे शब्द के लिए आगे / पीछे खोज) के बारे में नहीं जानता था। यह थोड़े शांत है। एफ / एफ और टी / टी और; वर्तमान लाइन पर वर्णों के लिए कमांड त्वरित जंप हैं। f / F ने संकेत दिए गए वर्ण पर कर्सर रखा, जबकि t / T इसे "up to the character" (चरित्र से पहले या बाद में चुने गए दिशा के अनुसार चरित्र) में रखा; बस सबसे हाल ही में f / F / t / T दोहराता है। जंप (उसी दिशा में)।
जिम डेनिस

10
:) vim.org पर सुझाव पृष्ठ के शीर्ष पर टैगलाइन: "क्या आप कल्पना कर सकते हैं कि कितने कीस्ट्रोक्स को बचाया जा सकता था, अगर मैं केवल" * "कमांड को समय पर जानता था?" -
ज्यूर्गन

1
जैसा कि जिम ने उल्लेख किया है, "टी / टी" कॉम्बो अक्सर उतना ही अच्छा होता है, यदि बेहतर नहीं, उदाहरण के लिए, ct(शब्द को मिटा देगा और आपको सम्मिलित मोड में डाल देगा, लेकिन पैरेन्थेस को रखें!
PUK

34

अधिवेशन

ए। सत्र को बचाए

: mks सत्रनाम

ख। बल बचाओ सत्र

: MKS! sessionname

सी। लोड सत्र

gvim या vim -S सेशन


जोड़ना और घटाना

ए। जोड़ना और घटाना

CTRL-A; कर्सर पर या उसके बाद संख्या या वर्णमाला वर्ण में [गिनती] जोड़ें। {वि में नहीं

CTRL-X; कर्सर के बाद या उसके बाद की संख्या या अक्षर वर्ण से [गिनती] घटाना। {वि में नहीं}

ख। विंडो की अनमैपिंग

विंडो में, Ctrl-A पहले से ही पूरे फ़ाइल चयन के लिए मैप किया गया है जिसे आपको आरसी फ़ाइल में अनमैप करना है। mswin.vim CTRL-A मैपिंग भाग को टिप्पणी के रूप में चिह्नित करें या अपनी आरसी फ़ाइल को अनमैप के साथ जोड़ें

सी। मैक्रों के साथ

मैक्रो में CTRL-A कमांड बहुत उपयोगी है। उदाहरण: क्रमांकित सूची बनाने के लिए निम्न चरणों का उपयोग करें।

  1. पहली सूची प्रविष्टि बनाएं, सुनिश्चित करें कि यह एक संख्या से शुरू होती है।
  2. क्यूए - बफर 'ए' में रिकॉर्डिंग शुरू करें
  3. वाई - प्रवेश प्रवेश
  4. पी - पहले एक के नीचे प्रविष्टि की एक प्रति डालें
  5. CTRL-A - संख्या में वृद्धि
  6. q - रिकॉर्डिंग बंद करो
  7. @ ए - यान, पुट और इंक्रीमेंट बार दोहराएं

1
किसी भी विचार विंडोज में शॉर्टकट क्या हैं?
डॉन रेबा

32

पिछले सप्ताह काम पर हमारी परियोजना को एक अन्य परियोजना से बहुत सारे पायथन कोड विरासत में मिले। दुर्भाग्य से कोड हमारे मौजूदा वास्तुकला में फिट नहीं था - यह सब वैश्विक चर और कार्यों के साथ किया गया था, जो बहु-सूत्रीय वातावरण में काम नहीं करेगा।

हमारे पास ~ 80 फाइलें थीं जिन्हें ऑब्जेक्ट ओरिएंटेड होने के लिए फिर से काम करने की आवश्यकता थी - सभी फ़ंक्शन कक्षाओं में चले गए, पैरामीटर बदल गए, आयात विवरण जोड़े गए, आदि हमारे पास लगभग 20 प्रकार के फिक्स की एक सूची थी जो प्रत्येक फ़ाइल के लिए आवश्यक थी। मेरा अनुमान है कि इसे हाथ से करने पर एक व्यक्ति प्रति दिन 2-4 कर सकता है।

इसलिए मैंने पहले एक हाथ से किया और फिर परिवर्तनों को स्वचालित करने के लिए एक विम स्क्रिप्ट लिखी। इसमें से अधिकांश विम आदेशों की एक सूची थी

" delete an un-needed function "
g/someFunction(/ d

" add wibble parameter to function foo "
%s/foo(/foo( wibble,/

" convert all function calls bar(thing) into method calls thing.bar() "
g/bar(/ normal nmaf(ldi(`aPa.

पिछले एक स्पष्टीकरण के हकदार हैं:

g/bar(/  executes the following command on every line that contains "bar("
normal   execute the following text as if it was typed in in normal mode
n        goes to the next match of "bar(" (since the :g command leaves the cursor position at the start of the line)
ma       saves the cursor position in mark a
f(       moves forward to the next opening bracket
l        moves right one character, so the cursor is now inside the brackets
di(      delete all the text inside the brackets
`a       go back to the position saved as mark a (i.e. the first character of "bar")
P        paste the deleted text before the current cursor position
a.       go into insert mode and add a "." 

अधिक जटिल परिवर्तनों के एक जोड़े के लिए जैसे कि सभी आयात विवरणों को उत्पन्न करना मैंने कुछ अजगर को विम स्क्रिप्ट में एम्बेड किया।

इस पर काम करने के कुछ घंटों के बाद मेरे पास एक स्क्रिप्ट थी जो कम से कम 95% रूपांतरण करेगी। मैं सिर्फ vim में एक फाइल खोलता हूं, फिर रन करता हूं :source fixit.vimऔर फाइल पलक झपकते ही बदल जाती है।

हमारे पास अभी भी शेष 5% को बदलने का काम है जो स्वचालित रूप से और परिणामों के परीक्षण के लायक नहीं था, लेकिन इस स्क्रिप्ट को लिखने में एक दिन बिताने से मुझे लगता है कि हमने हफ्तों के काम को बचा लिया है।

बेशक इसे अजगर या रूबी जैसी पटकथा भाषा के साथ स्वचालित करना संभव होगा, लेकिन इसे लिखने में अधिक समय लगेगा और कम लचीला होगा - अंतिम उदाहरण मुश्किल होगा क्योंकि रेगेक्स अकेले ही नहीं संभाल पाएंगे। नेस्टेड कोष्ठक, उदाहरण के लिए कन्वर्ट bar(foo(xxx))करने के लिए foo(xxx).bar()। विम कार्य के लिए एकदम सही था।


1
साझा करने के लिए बहुत बहुत धन्यवाद जो "उपयोगी और शास्त्रीय नहीं" मैक्रोज़ से सीखना बहुत अच्छा है।
ओलिवियर पोंस

%s/\(bar\)(\(.\+\))/\2.\1()/वह भी करेगा। (एस्केप संगत हैं :set magic।) सिर्फ रिकॉर्ड के लिए। :)
Ipsquiggle

1
अगर आपको विम-स्टाइल से %s/\v(bar)\((.+)\)/\2.\1()/
बचना

@lpsquiggle: आपका सुझाव जटिल भावों को एक से अधिक कोष्ठक के साथ नहीं संभालेगा। उदा if bar(foo(xxx)) or wibble(xxx): बन जाता है if foo(xxx)) or wibble(xxx.bar(): जो पूरी तरह से गलत है।
डेव किर्बी

28

अंतर्निहित फ़ाइल एक्सप्लोरर का उपयोग करें! कमांड है :Exploreऔर यह आपको बहुत तेजी से अपने स्रोत कोड के माध्यम से नेविगेट करने की अनुमति देता है। मेरे पास ये मैपिंग हैं .vimrc:

map <silent> <F8>   :Explore<CR>
map <silent> <S-F8> :sp +Explore<CR>

खोजकर्ता आपको फ़ाइल संशोधन करने की अनुमति देता है, भी। मैं अपनी कुछ पसंदीदा कुंजियाँ पोस्ट करूँगा, दबाने <F1>से आपको पूरी सूची मिल जाएगी:

  • - : सबसे उपयोगी: ऊपरी निर्देशिका में बदलें ( cd ..)
  • mf : एक फ़ाइल को चिह्नित करें
  • डी : चिह्नित फ़ाइलों को हटा दें या यदि कोई चिह्न नहीं है, तो कर्सर चालू है।
  • आर : कर्सर पर फ़ाइल का नाम बदलें।
  • d : वर्तमान निर्देशिका में एक नई निर्देशिका बनाएँ
  • % : वर्तमान निर्देशिका में एक नई फ़ाइल बनाएँ

1
मैंने हमेशा सोचा था कि अधिकांश सामानों के लिए थोड़े चूसने के लिए डिफ़ॉल्ट तरीके। यदि आप जानते हैं कि आप कहाँ जाना चाहते हैं, तो ब्राउज़ करना धीमा है। LimExplorer vim.org के स्क्रिप्ट अनुभाग से एक बहुत आवश्यक सुधार है।
Svend

आपका दूसरा मानचित्रण अधिक सरल हो सकता है: मानचित्र <मौन> <S-F8>: सेक्सप्लोर <CR>
वृषभ ओल्सन

8
मैं अंतर्निहित एक्सप्लोरर के बजाय NERDtree की सलाह देता हूं। इसने परियोजनाओं के लिए मेरे उपयोग के तरीके को बदल दिया है और मुझे बहुत अधिक उत्पादक बना दिया है। बस इसके लिए google है।
3

मुझे कभी भी स्रोत के पेड़ की खोज करने की आवश्यकता महसूस नहीं होती है, मैं बस उपयोग करता हूं :find, :tagऔर विभिन्न संबंधित कीस्ट्रोक्स के चारों ओर कूदने के लिए। (शायद ऐसा इसलिए है क्योंकि मेरे द्वारा काम किए जाने वाले स्रोत के पेड़ बड़े और व्यवस्थित हैं, जितना मैंने किया होगा :)?)
डैश-टॉम-बैंग

25

मैं अमेरिकन क्रिप्टोग्राम एसोसिएशन का सदस्य हूं। द्विमासिक पत्रिका में विभिन्न प्रकार के 100 से अधिक क्रिप्टोग्राम शामिल हैं। मोटे तौर पर इनमें से 15 "क्रिप्टारिथम्स" हैं - अंकों के लिए प्रतिस्थापित पत्रों के साथ विभिन्न प्रकार की अंकगणितीय समस्याएं। संख्याओं के बजाय अक्षरों को छोड़कर, इनमें से दो या तीन सूडोकस हैं। जब ग्रिड पूरा हो जाता है, तो नौ अलग-अलग अक्षरों में एक शब्द या शब्द, कुछ रेखा पर, विकर्ण, सर्पिल, इत्यादि, ग्रिड में कहीं भी होगा।

पेंसिल के साथ काम करने, या हाथ में समस्याओं को टाइप करने के बजाय, मैं उनकी वेबसाइट के सदस्यों के क्षेत्र से समस्याओं को डाउनलोड करता हूं।

इन सुडोकुओं के साथ काम करते समय, मैं vi का उपयोग करता हूं, सिर्फ इसलिए कि मैं उन सुविधाओं का उपयोग कर रहा हूं जो vi के पास कुछ अन्य संपादकों के पास हैं। अधिकतर पत्रयुक्त ग्रिड को एक गिने हुए ग्रिड में परिवर्तित करने के लिए, क्योंकि मुझे हल करना आसान लगता है, और फिर हल किए गए ग्रिड को वापस पत्र या ग्रिड में हल करने के लिए पूरा किया जाता है।

समस्या को नौ अक्षरों के नौ समूहों के रूप में स्वरूपित किया गया है - दो पंक्तियों में लिखे गए रिक्त स्थान का प्रतिनिधित्व किया गया है। पहला चरण यह है कि इनको नौ वर्णों की नौ पंक्तियों में स्वरूपित किया जाए। इस बारे में कुछ खास नहीं है, बस आठ स्थानों पर आठ लाइनब्रेक डालें।

परिणाम इस तरह दिखेगा:

T-O-----C
-E-----S-
--AT--N-L
---NASO--
---E-T---
--SPCL---
E-T--OS--
-A-----P-
S-----C-T

इसलिए, इसे संख्याओं में परिवर्तित करने के लिए पहला कदम अलग-अलग अक्षरों की एक सूची बनाना है। सबसे पहले, मैं ब्लॉक की एक प्रति बनाता हूं। मैं ब्लॉक के शीर्ष पर कर्सर रखता हूं, फिर टाइप करता हूं :y}}p:मुझे कमांड मोड में डालता है, yअगला आंदोलन कमांड देता है। चूंकि }अगले पैराग्राफ के अंत में एक चाल है, पैराग्राफ को y}yanks। }फिर कर्सर को पैराग्राफ के अंत में ले जाता है, और pकर्सर के ठीक बाद हमने जो कुछ किया था , उसे चिपकाता है। इसलिए y}}pअगले पैराग्राफ की एक प्रति बनाता है, और दो प्रतियों के बीच कर्सर के साथ समाप्त होता है।

इसके बाद, मुझे उन प्रतियों में से एक को अलग-अलग अक्षरों की सूची में बदलना है। यह आदेश थोड़ा अधिक जटिल है:

:!}tr -cd A-Z | sed 's/\(.\)/\1\n/g' | sort -u | tr -d '\n'

:फिर से मुझे कमांड मोड में डालता है। !इंगित करता है कि अगले यान की सामग्री को कमांड लाइन के माध्यम से पाइप किया जाना चाहिए। }अगले पैराग्राफ को यैंक करता है, और कमांड लाइन तब trऊपरी-केस अक्षरों को छोड़कर सब कुछ छीनने के लिए कमांड का उपयोग करता है , sedप्रत्येक अक्षर को एक लाइन पर प्रिंट करने के लिए कमांड, और sortउन लाइनों को सॉर्ट करने के लिए कमांड, डुप्लिकेट को हटाता है, और फिर trस्ट्रिप्स निकलता है newlines, एक पंक्ति में नौ अलग-अलग अक्षरों को छोड़कर, मूल रूप से अनुच्छेद बनाने वाली नौ लाइनों की जगह ले रहा है। इस मामले में, पत्र हैं: ACELNOPST

अगला कदम ग्रिड की एक और प्रतिलिपि बनाना है। और फिर उन अक्षरों का उपयोग करने के लिए जिन्हें मैंने पहचान लिया है, उनमें से प्रत्येक अक्षर को 1 से 9 तक के अंकों के साथ बदलना आसान है :!}tr ACELNOPST 0-9। परिणाम है:

8-5-----1
-2-----7-
--08--4-3
---4075--
---2-8---
--7613---
2-8--57--
-0-----6-
7-----1-8

यह तब सामान्य तरीके से हल किया जा सकता है, या किसी भी सुडोकू सॉल्वर में प्रवेश किया जा सकता है जिसे आप पसंद कर सकते हैं। पूरा किया गया समाधान फिर से अक्षरों में परिवर्तित किया जा सकता है :!}tr 1-9 ACELNOPST

Vi में वह शक्ति है जो बहुत कम अन्य लोगों से मेल खाती है। सबसे बड़ी समस्या यह है कि बहुत ही कम vi ट्युटोरियल बुक्स, वेबसाइट्स, हेल्प-फाइल्स इत्यादि में से बहुत मुश्किल से ही सतह को छू पाते हैं।


और एक जलन यह है कि कुछ डिस्ट्रोब्स जैसे ubuntu के पास "vi" शब्द से "vim" उपनाम है, इसलिए लोग वास्तव में vi नहीं देखेंगे। बहुत बढ़िया उदाहरण, कोशिश करनी है ... +1
hhh

1
क्या यह उस नाम की जांच नहीं करता है जिसे इसके साथ शुरू किया गया था ताकि यह सही 'मोड' में आ सके?
डैश-टॉम-बैंग

3
मैं इस बार-बार की त्रुटि से चकित हूँ: आप कहते हैं कि आपको :कमांड मोड में जाने की आवश्यकता है, लेकिन तब आप सामान्य मोड कमांड (जैसे y}}p) निर्दिष्ट करते हैं , जो संभवतः कमांड मोड से काम नहीं कर सकता है ?!
sehe

अद्वितीय वर्ण पर मेरे ले को चुनौती: :se tw=1 fo=(तैयारी) VG:s/./& /g(रिक्त स्थानों डालने), gvgq(अलग-अलग पंक्तियों पर विभाजित), V{:sort u(तरह और निकालें डुप्लिकेट)
sehe

23

थोक पाठ जोड़तोड़!

मैक्रोज़ के माध्यम से या तो:

  • रिकॉर्डिंग के साथ शुरू करें: qq
  • कार्य करना
  • रिकॉर्डिंग बंद करें: q
  • दोहराएँ: @q(पहली बार),@@ उसके बाद।
  • 20 बार दोहराएं: 20@@

या नियमित अभिव्यक्ति के माध्यम से:

  • सामान बदलें: :%s/[fo]+/bar/g

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


5
जेमी Zinsinski संदर्भ के लिए +1 । (इससे जुड़े, यहां तक ​​कि असफल होने के लिए कोई अंक वापस नहीं लिया गया)। :)
जिम डेनिस

1
@ मैं यह भी नहीं जानता था कि यह एक जेमी Zawinski बोली थी :)। मैं इसे अभी से याद करने की कोशिश करूँगा।
जकोनो

मैं निम्नलिखित ट्रिक को तेजी से उपयोगी पाता हूं ... उन मामलों के लिए जहां आप उन लाइनों से जुड़ना चाहते हैं जो उस मैच से जुड़ती हैं (या जो मेल नहीं खाती हैं) पिछली लाइन के लिए कुछ पैटर्न: :% g/foo/-1jया :'a,'z v/bar/-1jउदाहरण के लिए (जहां पूर्व "सभी लाइनें और पैटर्न से मेल खाता हो" जबकि उत्तरार्द्ध "निशान ए और मार्क जेड के बीच की रेखाएं हैं जो पैटर्न से मेल खाने में विफल हैं")। एक gया vपूर्व कमान में संरक्षक के बाद हिस्सा किसी भी अन्य पूर्व कमानों हो सकता है, -1j सिर्फ एक रिश्तेदार लाइन आंदोलन है और कमांड में शामिल हो।
जिम डेनिस

बेशक, यदि आप अपने मैक्रो '2' का नाम लेते हैं, तो जब इसका उपयोग करने का समय आता है, तो आपको अपनी उंगली को '@' कुंजी से 'q' कुंजी पर ले जाने की भी आवश्यकता नहीं है। संभवत: हर बार वहीं 50 से 100 मिलीसेकंड बचाता है। = P
JustJeff

@JustJeff आपके कीबोर्ड लेआउट पर पूरी तरह निर्भर करता है, मेरी @ कुंजी मेरी 2 कुंजी से कीबोर्ड के दूसरी तरफ है।
साइमन स्टील

23

मुझे हाल ही में पता चला है q:। यह "कमांड विंडो" को खोलता है और आपके सबसे हाल के पूर्व-मोड (कमांड-मोड) कमांड को दिखाता है। आप खिड़की के भीतर हमेशा की तरह बढ़ सकते हैं, और दबा सकते हैं<CR> कमांड को । आप आदि को भी संपादित कर सकते हैं। जब आप कुछ जटिल कमांड या रेगेक्स के साथ गड़बड़ कर रहे हों, तो अनमोल और आप पूरी चीज़ को फिर से लिखना नहीं चाहते हैं, या यदि आप जिस जटिल चीज़ को करना चाहते हैं, वह 3 कमांड्स है। यह लगभग बैश की तरह है set -o vi, लेकिन खुद के लिए (हेह!)।

:help q:आगे और पीछे जाने के लिए और अधिक दिलचस्प बिट्स के लिए देखें ।


22

मैं सिर्फ दूसरे दिन विम के omnicompletion खोज की, और जब तक मैं मानता हूँ मैं पर थोड़ा धुंधला कर रहा हूँ क्या करता है जो, मैं सिर्फ या तो mashing आश्चर्यजनक रूप से अच्छे परिणाम मिला है Ctrl+ x Ctrl+ uया Ctrl+ n/ Ctrl+ pडालने में मोड। यह काफी इंटेलीजेंस नहीं है , लेकिन मैं अभी भी इसे सीख रहा हूं।

कोशिश करके देखो! :help ins-completion


20

ये शॉर्टकट नहीं हैं, लेकिन ये संबंधित हैं:

  1. एक अतिरिक्त ईएससी (या Ctrl) कैपलॉक करें
  2. इस आदेश के साथ "," (अल्पविराम) के लिए मानचित्र नेता: मानचित्रकार = ","

वे मेरी उत्पादकता बढ़ाते हैं।


अरे "" के बारे में अच्छा संकेत! टाइप करना बेहतर है "," से "\"।
ओलिवियर पोंस

2
कैप्स लॉक को विंडोज में एक अतिरिक्त Esc बनाने के लिए (क्या एक कैप्स लॉक कुंजी है? एक "कोई भी कुंजी?"), इसके लिए प्रयास करें: web.archive.org/web/20100418005858/http://webpages.charter.net-…
आर। मार्टिनो फर्नांडीस 3

पर विवरण - मैक पर, आप PCKeyboardHack जरूरत superuser.com/questions/34223/...
टॉम मॉरिस

1
विंडोज पर मैं Capslock::Escape
ऑटोहॉटकेय का

19

एक और उपयोगी vi "शॉर्टकट" जिसका मैं अक्सर उपयोग करता हूं वह है 'xp'। यह कर्सर को अगले वर्ण के साथ स्वैप करेगा।


3
Xpदूसरे रास्ते पर जाने के लिए
परीक्षक

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

18

स्क्रीन को लंबवत रूप से विभाजित करने के लिए <Ctrl> + W, V
<Ctrl> + W, W खिड़कियों के बीच स्थानांतरित करने के लिए

इस विंडो में जो स्क्रिप्ट मैं एडिट कर रहा हूं, उसे चलाने के लिए python% [args]

दृश्यमान मोड में ZF मनमानी लाइनों को मोड़ने के लिए


2
<Ctrl> + W और j / k आपको पूरी तरह से नेविगेट करने देगा (सामान्य अप के साथ j, k डाउन, जैसा कि)। जब आपके पास 3+ विभाजन हो तो यह बहुत अच्छा है।
एंड्रयू स्कैग्नेली

1
विज़ुअल मोड में zf के लिए +1, मुझे कोड फोल्डिंग पसंद है, लेकिन इसके बारे में नहीं पता था।
कोडर_टीम

2
मेरे कीबोर्ड को कोसने के बाद मैंने यह घटा दिया है <C-w>nया <C-w>sनई क्षैतिज विंडो है, <C-w>bनीचे दाईं विंडो है, <C-w>cया <C-w>qविंडो बंद है, <C-w>xबढ़ रही है और फिर विंडो की चौड़ाई कम करें (??), <C-w>pअंतिम विंडो है, <C-w>backspaceलेफ्ट लेफ्ट (ish) विंडो है
puk

:help ctrl-wFTW ... अपने आप को एक एहसान करो, और अपने आप को कम से कम 15 मिनट के लिए इन चीजों की कोशिश करने के लिए मजबूर करें!
सूज

18

दृश्य विधा

जैसा कि कई अन्य लोगों ने कहा है, दृश्य मोड आपकी कॉपी / कट और पेस्ट समस्या का जवाब है। विम आपको 'वी', 'वी' और सीवी देता है। कम मामला 'v' vim में अनिवार्य रूप से नोटपैड में शिफ्ट कुंजी के समान है। अच्छी बात यह है कि आपको इसे रोकना नहीं है। आप अपने चयन के शुरुआती (या समाप्त) बिंदु पर कुशलता से नेविगेट करने के लिए किसी भी आंदोलन तकनीक का उपयोग कर सकते हैं। फिर 'v' को हिट करें, और अपने चयन के दूसरे छोर पर नेविगेट करने के लिए फिर से कुशल आंदोलन तकनीकों का उपयोग करें। तब 'd' या 'y' आपको उस चयन को काटने या कॉपी करने की अनुमति देता है।

जिम में डेनिस की कट / कॉपी / पेस्ट के बारे में लाभ विम के विजुअल मोड में यह है कि आपको स्थान बिल्कुल ठीक नहीं है। कभी-कभी एक त्वरित आंदोलन का उपयोग करने के लिए यह अधिक कुशल होता है कि आप कहाँ जाना चाहते हैं और उसके बाद फिर से परिशोधन करें कि अन्य आंदोलनों के साथ एक और अधिक जटिल एकल आंदोलन कमांड के बारे में सोचने के लिए जो आपको ठीक उसी स्थान पर पहुंचाए जहां आप जाना चाहते हैं।

इस तरीके से बड़े पैमाने पर दृश्य मोड का उपयोग करने के लिए नकारात्मक पक्ष यह है कि यह एक बैसाखी बन सकता है जो आप हर समय उपयोग करते हैं जो आपको नए vi (m) कमांड सीखने से रोकता है जो आपको चीजों को अधिक कुशलता से करने की अनुमति दे सकता है। हालाँकि, यदि आप vi (m) के नए पहलुओं को सीखने के बारे में बहुत सक्रिय हैं, तो यह संभवतः आपको बहुत प्रभावित नहीं करेगा।

मैं इस बात पर भी ज़ोर दूंगा कि विज़ुअल लाइन और विज़ुअल ब्लॉक मोड आपको इसी थीम पर विविधताएं देते हैं जो बहुत शक्तिशाली हो सकती हैं ... विशेष रूप से विज़ुअल ब्लॉक मोड।

कीबोर्ड के कुशल उपयोग पर

मैं आपकी इस बात से भी असहमत हूं कि बारी-बारी से कीबोर्ड इस्तेमाल करने का सबसे तेज़ तरीका है। इसमें सत्य का तत्व है। बहुत आम तौर पर बोलते हुए, एक ही चीज़ का बार-बार उपयोग धीमा है। इस सिद्धांत का यह सबसे महत्वपूर्ण उदाहरण है कि एक ही उंगली से टाइप किए गए लगातार कीस्ट्रोक बहुत धीमे हैं। आपका दावा संभवत: इस पैटर्न पर एस / उंगली / हाथ / परिवर्तन का उपयोग करने की प्राकृतिक प्रवृत्ति से उपजा है। कुछ हद तक यह सही है, लेकिन दक्षता स्पेक्ट्रम के अत्यधिक उच्च अंत में यह गलत है।

बस किसी भी पियानोवादक से पूछें। उनसे पूछें कि क्या बारी-बारी से हाथों में कुछ नोटों का एक उत्तराधिकार खेलना या एक ही हाथ की लगातार उंगलियों का उपयोग करना तेजी से है। 4 कीस्ट्रोक्स टाइप करने का सबसे तेज़ तरीका हाथों को वैकल्पिक करना नहीं है, लेकिन उन्हें आरोही या अवरोही क्रम में एक ही हाथ की 4 उंगलियों के साथ टाइप करना है (इसे "रन" कहें)। इस संभावना पर विचार करने के बाद यह स्व-स्पष्ट होना चाहिए।

अधिक कठिन समस्या इसके लिए अनुकूलन है। कीबोर्ड पर पूर्ण दूरी के लिए अनुकूलन करना बहुत आसान है। विम ऐसा करता है। "रन" स्तर पर अनुकूलित करना बहुत कठिन है, लेकिन vi (m) इसके साथ मोडल एडिटिंग आपको किसी भी गैर-मोडल दृष्टिकोण (अहम, ईमैक) की तुलना में इसे करने में सक्षम होने का बेहतर मौका देता है।

Emacs पर

ऐसा लगता है कि Emacs zealots पूरी तरह से उस अंतिम अभिभावक टिप्पणी के कारण मेरी पूरी पोस्ट की अवहेलना करता है, मुझे लगता है कि मुझे emacs और विम धर्मों के बीच अंतर की जड़ का वर्णन करना चाहिए। मैंने कभी भी संपादक युद्धों में बात नहीं की है और मैं शायद इसे फिर से नहीं करूंगा, लेकिन मैंने कभी किसी को इस तरह से मतभेदों का वर्णन करते नहीं सुना है, इसलिए यहां यह जाता है। अंतर निम्नलिखित ट्रेडऑफ़ है:

विम आपको बेजोड़ टेक्स्ट एडिटिंग दक्षता प्रदान करता है एमएसीएस आपको संपादक को कस्टमाइज़ और प्रोग्राम करने की बेजोड़ क्षमता प्रदान करता है

अंधे विम zealots दावा करेंगे कि विम एक स्क्रिप्टिंग भाषा है। लेकिन यह एक अस्पष्ट, तदर्थ भाषा है जिसे संपादक की सेवा के लिए डिज़ाइन किया गया था। Emacs में लिस्प है! पर्याप्त कथन। यदि आप उन पिछले दो वाक्यों के महत्व की सराहना नहीं करते हैं या उस प्रशंसा को विकसित करने के लिए कार्यात्मक प्रोग्रामिंग और लिस्प के बारे में पर्याप्त जानने की इच्छा रखते हैं, तो आपको विम का उपयोग करना चाहिए।

Emacs zealots दावा करेगा कि emacs में वाइपर मोड है, और इसलिए यह vim का सुपरसेट है। लेकिन वाइपर मोड मानक नहीं है। मेरी समझ यह है कि वाइपर मोड का उपयोग अधिकांश ईमैक उपयोगकर्ताओं द्वारा नहीं किया जाता है। चूंकि यह डिफ़ॉल्ट नहीं है, इसलिए अधिकांश एमएसीएस उपयोगकर्ता शायद मोडल प्रतिमान के लाभों के लिए एक सच्ची प्रशंसा विकसित नहीं करते हैं।

मेरी राय में ये अंतर ऑर्थोगोनल हैं। मेरा मानना ​​है कि विम और एमएसीएस के लाभ के रूप में मैंने कहा है कि वे दोनों वैध हैं। इसका मतलब यह है कि परम संपादक अभी तक मौजूद नहीं है। यह शायद सच है कि emacs सबसे आसान मंच होगा, जिस पर अंतिम संपादक को आधार बनाया जा सकता है। लेकिन मोडल एडिटिंग इमैक माइंडसेट में नहीं उलझी है। Emacs समुदाय भविष्य में इस तरह से आगे बढ़ सकता है, लेकिन इसकी बहुत संभावना नहीं है।

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


17

विम ट्यूटोरियल कर रहे 30 मिनट बिताएं (टर्मिनल में vim के बजाय vimtutor चलाएं)। आप बुनियादी आंदोलनों, और कुछ कीस्ट्रोक्स को सीखेंगे, यह आपको कम से कम उतना ही उत्पादक बना देगा जितना पहले इस्तेमाल किए गए पाठ संपादक के साथ। उसके बाद, अच्छी तरह से, जिम डेनिस का जवाब फिर से पढ़ें :)


1
यह पहली बात है जब मैंने ओपी को पढ़ा था। यह स्पष्ट है कि पोस्टर ने इसे कभी नहीं चलाया है; मैं इसके माध्यम से तब भाग गया जब दो साल पहले विम सीखना और यह मेरे दिमाग में किसी भी अन्य संपादकों का उपयोग करने के लिए विम की श्रेष्ठता को पुष्ट करता है (सहित, मेरे लिए, Emacs क्योंकि प्रमुख combos एक मैक पर उपयोग करने के लिए कष्टप्रद हैं) ।
डैश-टॉम-बैंग

16

आपके द्वारा विम का उपयोग करने का तरीका क्या है जो आपको समकालीन संपादक की तुलना में अधिक उत्पादक बनाता है?

बहुत कम कीस्ट्रोक्स (अक्सर मैक्रोज़ का उपयोग करके ) के साथ जटिल, दोहराव वाले संपादनों को निष्पादित करने में सक्षम होने के नाते । VimGolf पर नज़र डालें Vim की शक्ति का गवाह!

लगभग दैनिक उपयोग के दस वर्षों के बाद, किसी भी अन्य संपादक का उपयोग करना कल्पना करना मुश्किल है।


16

\cखोज को अनदेखा करने के लिए कहीं भी उपयोग करें (अपने अज्ञान या स्मार्टकेस सेटिंग को ओवरराइड करके)। उदाहरण के लिए /\cfooया /foo\cसे मेल खाएगी foo, Foo, fOO, FOO, आदि

\Cकेस मैचिंग को मजबूर करने के लिए कहीं भी उपयोग करें । जैसे /\Cfooया /foo\Cकेवल फू से मेल होगा।


16

मैं इस tआंदोलन का कोई भी उल्लेख नहीं पाकर हैरान था । मैं अक्सर dt,या के रूप में पैरामीटर सूचियों के साथ इसका उपयोग करता हूंyt,


2
या dfx, dFx, dtx, ytx, आदि जहाँ x एक char है, +1
hhh

हाँ! और सीटी (परिवर्तन) मत भूलना।
मार्कले 976

16

अजीब किसी का उल्लेख नहीं ctags। "अतिशयोक्ति ctags" डाउनलोड करें और इसे अपने खोज पथ में पहले से मौजूद भद्दे पूर्वस्थापित संस्करण के आगे रख दें। आप जो भी काम कर रहे हैं, उसके मूल में सीडी; उदाहरण के लिए Android कर्नेल वितरण। टाइप करें "ctags -R।" "टैग" नामक फ़ाइल में उस dir के नीचे कहीं भी स्रोत फ़ाइलों का एक सूचकांक बनाने के लिए। इसमें सभी टैग शामिल हैं, भाषा को नामांकित करते हैं और न ही डायर में, जहां एक फ़ाइल में, इसलिए क्रॉस-भाषा का काम आसान है।

फिर उस फ़ोल्डर में विम खोलें और पढ़ें: कुछ कमांड के लिए ctags की मदद करें। कुछ मैं अक्सर उपयोग:

  • विधि कॉल पर कर्सर रखें और विधि परिभाषा पर जाने के लिए CTRL-] टाइप करें।

  • प्रकार: टा नाम की परिभाषा पर जाने के लिए।


14

स्वचालित इंडेंटेशन:

gg(दस्तावेज़ की शुरुआत के लिए जाएं)
=(इंडेंट टाइम!)
shift-g(दस्तावेज़ के अंत में जाएं)

आपको अपनी .vimrcफ़ाइल में 'filetype plugin indent on' की आवश्यकता होगी , और शायद उपयुक्त 'shiftwidth' और 'Expandtab' सेटिंग्स।


4
या बस ": सेट एआई" (ऑटो-इंडेंट) सुविधा का उपयोग करें, जो शुरुआत से ही vi में रहा है।
xcramps

14

आपने उत्पादक शॉर्टकट्स के बारे में पूछा, लेकिन मुझे लगता है कि आपका असली सवाल यह है: क्या इसके लायक है? इस स्टैकओवरफ्लो प्रश्न का उत्तर है -> "हां"

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

आपके द्वारा लगाए गए सभी निवेश एक हजार गुना वापस भुगतान करेंगे। मरने से कई घंटे पहले आप कई पाठ संपादक के अंदर होंगे। विम आपका साथी होगा।


13

एकाधिक बफ़र, और विशेष रूप से दो फ़ाइलों की तुलना करने के लिए उनके बीच तेजी से कूदते हुए :bpऔर :bn(ठीक से एकल Shift+ pया Shift+ के लिए रीमैप किया गया n)

vimdiff मोड (दो ऊर्ध्वाधर बफ़र्स में विभाजन, अंतर दिखाने के लिए रंगों के साथ)

क्षेत्र-प्रति Ctrl+ के साथv

और अंत में, पहचानकर्ताओं का टैब पूरा होना ("mosh_tab_or_complete" के लिए खोज)। वह एक जीवन परिवर्तक है।


12

शीर्ष पोस्टर से सहमत - द : आर! कमांड बहुत उपयोगी है।

सबसे अधिक बार मैं इसे "पेस्ट" चीजों के लिए उपयोग करता हूं:

:r!cat
**Ctrl-V to paste from the OS clipboard**
^D

इस तरह मुझे फील नहीं करना है :set paste


3
डिफ़ॉल्ट रूप से सिस्टम क्लिपबोर्ड का उपयोग clipboardकरने के लिए unnamed( set clipboard=unnamedअपने .vimrc में) विकल्प सेट करने के लिए संभवतः बेहतर है । या यदि आप अभी भी सिस्टम क्लिपबोर्ड को अनाम रजिस्टर से अलग चाहते हैं, तो उचित रूप से नामित क्लिपबोर्ड रजिस्टर का उपयोग करें "*p:।
आर। मार्टिनो फर्नांडिस

2
इसे प्यार करना! वेब से कोड के उदाहरणों को चिपकाने के बाद अतिरंजित होने के बाद और मैं बस व्यर्थ में कुशल महसूस करना शुरू कर रहा था। यही वह आज्ञा थी जिसका मैंने मौके पर सपना देखा था। यह तब था जब विम ने पूरी तरह से मुझे झुका दिया।
केवपी

यदि आप एक मैक, कमांड + सी और कमांड + वी पर कॉपी कर रहे हैं और सिस्टम क्लिपबोर्ड का उपयोग करके कॉपी करते हैं, तो किसी भी रीमैप की आवश्यकता नहीं है।
बेन मोर्दकै

केवल GVIm के साथ ... कंसोल से, बिना चिपकाने के :set pasteइतने अच्छे से काम नहीं किया जाता है यदि ऑटोइंडेंट सक्षम है।
डेविड वोलेवर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.