हालांकि मैं इस बात से इनकार नहीं कर सकता कि मैं भी शुरुआत में vi से जूझता था, मुझे लगता है कि एक तर्क दिया जा सकता है कि vi वास्तव में सीखने के लिए बहुत सरल है। (जब मैंने यूनिक्स का उपयोग करना शुरू किया तो चुनाव या तो vi या emacs था, इसलिए जिस समय मैंने एड चुना, एड एक बहुत ही सरल लाइन एडिटर था, जिसे मैंने पहले से ही यूनिक्स टेक्स्टबुक्स पढ़ने से सीखा था।) मैं vi दैनिक का उपयोग करता हूं, लेकिन मैं शायद। इसकी विशेषताओं का केवल एक बहुत छोटा सबसेट उपयोग करें।
Vi का उपयोग करने के लिए पहले एक तर्क दिया गया है: vi सभी प्रणालियों पर मौजूद है, बहुत कम संसाधनों का उपयोग करता है, और अस्थिर और धीमी कनेक्शन पर प्रयोग करने योग्य हो सकता है, जहां अन्य संपादक विफल हो सकते हैं या धीमे और अनुपयोगी हो सकते हैं। या ऐसी स्थितियों में जहां सिस्टम टूट गया है, इसलिए तीर कुंजियों की सही तरीके से व्याख्या नहीं की जाती है (उदाहरण के लिए खराब टर्मोफ सेटिंग।) तो समस्या से प्रभावित होने वाले कॉन्फ़िगरेशन फ़ाइलों को समस्या के बिना ठीक करने के लिए vi का उपयोग किया जा सकता है।
और यहां बताया गया है कि vi का एक उपयोगी सबसेट कैसे सीखना है: पहला: vi को एक इंटरैक्टिव, टर्मिनल-जीयूआई "संपादक" के रूप में सोचना बंद करें, और इसे पाठ फ़ाइलों में हेरफेर करने के लिए एक प्रोग्रामिंग भाषा के रूप में देखें। शुरुआत में "vi" छठी विधा के लिए खड़ा था, और vi में एक गैर-विवादास्पद समकक्ष पूर्व है, जो शुरू करने के लिए एक अच्छी जगह है। शेल प्रॉम्प्ट पर पूर्व टाइप करें (मैं रिटर्न का प्रतिनिधित्व करने के लिए prompt का उपयोग करेगा):
$ ex¬
Entering Ex mode. Type "visual" to go to Normal mode.
:
अब एंटर दबाएं।
:¬
E749: empty buffer
:
तो, कुछ इसमें डालते हैं। "A Type" टाइप करें, और पाठ की एक पंक्ति टाइप करें, फिर एक पंक्ति अपने आप में एक अवधि:
:a¬
Hello World¬
.¬
:
यही अपेंड कमांड था। आसान, छोटा और महामारी। लेकिन यह देखना अच्छा होगा कि बफर में क्या है:
:%p¬
Hello World
:
यह स्पष्ट रूप से प्रिंट कमांड, पी था। % एक लाइन रेंज शॉर्टहैंड है। प्रत्येक कमांड लाइन संख्या या सीमा से पहले हो सकती है जिसे कमांड को लागू करना चाहिए। % का अर्थ है "सभी लाइनें"। $ का अर्थ है अंतिम रेखा, और एक अवधि का अर्थ है वर्तमान रेखा। एक संख्या का मतलब है कि विशेष रेखा। एक श्रेणी n, m लिखी जाती है और एक संख्या को जोड़ा या घटाया जा सकता है, इसलिए। + 1, $ - 1 का अर्थ अगली पंक्ति से दूसरी-अंतिम पंक्ति तक होता है। एक कमांड जिसमें केवल एक पंक्ति संख्या होती है, उस रेखा पर जाती है। यहाँ मेरे द्वारा उपयोग की जाने वाली शेष छोटी संख्या है:
:1i¬
this text is inserted before line 1.¬
.¬
:
:w /tmp/filename¬
"/tmp/filename" [New] 2L, 49C written
:
w किसी फ़ाइल में सभी (या चुनी हुई रेंज) लाइनों को लिखता है।
:1d¬
लाइन 1 को हटाता है।
:.s/Hello/Hello,/¬
Hello, World
:.s/$/!/¬
Hello, World!
s एक नियमित अभिव्यक्ति का विकल्प है। नियमित अभिव्यक्ति जानना अच्छा है!
:q¬
E37: No write since last change (add ! to override)
q क्विट करता है। wq लिखता है और क्विट करता है। क्ष! लेखन के बिना, और एक समान नस में, डब्ल्यू! यदि संभव हो तो एक फाइल को लिखने के लिए मजबूर करता है।
अब एक शांत:
:p
Hello, World!
:.!tr a-z A-Z
:p
HELLO, WORLD!
! एक कमांड के रूप में एक शेल कमांड में लाइनों को फ़िल्टर करता है।
और अंत में:
:vi¬
प्रवेश मोड में प्रवेश करता है। मूर्ख मत बनो। यह एक संपादक की तरह दिखता है, लेकिन यह अभी भी एक इंटरैक्टिव प्रोग्रामिंग शेल है। आपको बस हर समय बफर को देखने के लिए मिलता है, और कुछ और कमांड। दृश्य मोड में a: दिखाता है: पूर्व मोड से संकेत मिलता है। तीर कुंजी (यदि वे काम करते हैं) चारों ओर घूमती हैं, और यदि वे नहीं करते हैं, तो hjkl करते हैं! h बाएँ, j नीचे, k ऊपर और l दाएँ। 0 पहले वर्ण पर ले जाता है और ^ (यहां पर रेगेक्स लगता है!) लाइन पर पहले गैर-स्थान वर्ण पर जाता है। $ (रीगेक्स फिर से!) लाइन के अंत में जाता है। टाइपिंग: 999 like स्वाभाविक रूप से एक्स मोड की तरह, लाइन 999 तक जाती है।
"i" इंसर्ट मोड में प्रवेश करता है, जो अब लाइनों के बजाय वर्णों पर सम्मिलित करता है, और ".¬" के बजाय प्रेसिंग एस्केप से समाप्त होता है। "मैं" शुरुआत में सम्मिलित करता हूं, "ए" कर्सर के नीचे चरित्र के बाद, और "ए" वर्तमान लाइन के अंत के बाद। टेक्स्ट लिखते समय हमेशा बच को दबाएं। "x" कर्सर के नीचे के वर्ण को हटाता है, और "D" कर्सर से लाइन के अंत तक हटा देता है। "Y" यान (प्रतियां) वर्तमान रेखा है, और "P" इसे वापस चिपका देता है। ", पु" ऐसा ही करता है, लेकिन एक पंक्ति संख्या से पहले किया जा सकता है। "Y", "Y" का पूर्व समतुल्य है, और फिर से, लाइन रेंज पर लागू करने के लिए उपयोगी है। मुझे लगता है कि एक मार्क कमांड भी है, लेकिन मैं स्वीकार करूंगा कि मुझे यह याद नहीं है। मुझे इसकी कमी नहीं है।
उपरोक्त वह है जो मैं उपयोग करता हूं, और मुझे पता है कि मैं शायद बहुत "कुशल" vi उपयोगकर्ता नहीं हूं। दूसरी ओर, मैं पूर्व की बहुमुखी प्रतिभा का उपयोग करता हूं, उदाहरण के लिए कॉन्फ़िगरेशन कॉन्फ़िगरेशन फ़ाइलों को स्क्रिप्ट करने के लिए। कई फाइलों में अपने होस्टनाम foo.bar.com को www.foobar.com में बदलने की आवश्यकता है?
for file in conf/*
do (echo "%s/foo.bar.com/www.foobar.com/" ; echo "wq") |ex $file ; done
मैं जो कहना चाह रहा हूं, वह यह है कि मुझे लगता है कि vi के साथ समस्या यह है कि लोग इसे एक कठिन संपादक मानते हैं। यह सब अपनी मानसिकता को थोड़ा बदलना है, और इसे एक बहुत ही सरल अभी तक बहुत शक्तिशाली इंटरैक्टिव प्रोग्रामिंग भाषा के रूप में देखना है। इतना शक्तिशाली कि उपलब्ध कमांडों के एक सबसेट के साथ भी, आप इसे बहुत प्रभाव के लिए उपयोग कर सकते हैं - न केवल एक संपादक के रूप में, बल्कि एक सामान्य, स्क्रिप्ट योग्य टूल के रूप में अच्छी तरह से बाकी यूनिक्स के साथ एकीकृत। मुझे शक है कि नैनो यह सब करेगी - emacs ... शायद।