विम के साथ आपकी समस्या यह है कि आप vi को नहीं टटोलेंगे ।
आप के साथ काटने का उल्लेख करते हैं yy
और शिकायत करते हैं कि आप लगभग पूरी रेखाओं को कभी नहीं काटना चाहते हैं। वास्तव में प्रोग्रामर, एडिटिंग सोर्स कोड, बहुत बार पूरी लाइनों, लाइनों की श्रेणी और कोड के ब्लॉक पर काम करना चाहते हैं। हालाँकि, yy
अनाम प्रतिलिपि बफ़र (या "रजिस्टर" के रूप में इसे vi में कहा जाता है ) में पाठ को yank करने के केवल कई तरीकों में से एक है ।
Vi का "ज़ेन" यह है कि आप एक भाषा बोल रहे हैं। प्रारंभिक y
एक क्रिया है। कथन yy
का पर्यायवाची है y_
। y
यह आसान टाइप करने के लिए है, क्योंकि यह इस तरह के एक आम आपरेशन है बनाने के लिए ऊपर दोगुनी है।
इसे भी व्यक्त किया जा सकता है dd
P
(वर्तमान लाइन को हटा दें और कॉपी को वापस जगह पर चिपका दें; एक कॉपी को साइड इफेक्ट के रूप में अनाम रजिस्टर में छोड़ दें)। y
और d
verbs "" उनके के रूप में किसी भी आंदोलन ले "विषय।" इस प्रकार 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 की प्रतिलिपि में ) मैं अभी उपयोग करता हूं:
0i:r
(वर्तमान लाइन को वैध : r कमांड में बदलने के लिए ),
"cdd
(लाइन को "सी" रजिस्टर में हटाने के लिए) और
@c
उस आदेश पर अमल करें।
यह केवल 10 कीस्ट्रोक्स है (और अभिव्यक्ति "cdd
@c
प्रभावी रूप से मेरे लिए एक उंगली मैक्रो है, इसलिए मैं इसे लगभग किसी भी सामान्य छह अक्षर के शब्द के रूप में टाइप कर सकता हूं)।
एक साहब ने सोचा
मैंने केवल vi की शक्ति की सतह को खरोंच दिया है और यहां जो कुछ भी मैंने वर्णित किया है, उनमें से कोई भी "सुधार" का हिस्सा नहीं है, जिसके लिए विम का नाम दिया गया है! मैंने यहां जो कुछ भी वर्णित किया है, वे सभी 20 या 30 साल पहले vi की किसी भी पुरानी प्रति पर काम करना चाहिए ।
ऐसे लोग हैं, जिन्होंने मेरी इच्छा से कहीं अधिक vi की शक्ति का उपयोग किया है ।