कई कर्सर का उपयोग करना एक विमर बात नहीं है
जैसा कि मैंने मल्टी कमर्स (यहां तक कि एक प्लगइन के साथ) का उपयोग करते हुए टिप्पणियों में कहा था, "विम तरीका का पालन करना" वास्तव में नहीं है, मैं पूरी तरह से समझता हूं कि यह उदात्त-पाठ से आने वाले किसी व्यक्ति के लिए आकर्षक है, लेकिन आप अक्सर ऐसे विकल्प पा सकते हैं जो कम से कम हैं अंतर्निहित सुविधाओं के साथ विम के रूप में कुशल।
बेशक, इन वैकल्पिक समाधानों को ढूंढना हमेशा आसान नहीं होता है और कभी-कभी इसमें समय लगता है लेकिन यह आपके विम अनुभव के साथ आसान हो जाएगा और आप देखेंगे कि समय के साथ कई कर्सर आपके लिए पूरी तरह से बेकार लगेंगे।
यह अच्छा है लेकिन मैं एक वैकल्पिक तरीका कैसे खोज सकता हूं?
इसका कोई सार्वभौमिक उत्तर नहीं है क्योंकि यह इस बात पर बहुत निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं, मैं सिर्फ कोशिश करने के लिए पहली चीजों के बारे में कुछ संकेत देने की कोशिश करूंगा:
डॉट कमांड .
डॉट कमांड शायद विम में सबसे शक्तिशाली उपकरणों में से एक है, यह बस हमें पिछले बदलाव को दोहराने की अनुमति देता है। मैं इसे ड्रू नील से बेहतर अपने प्रैक्टिकल विम में नहीं समझा सकता था । मुझे लगता है कि प्रत्येक विमर्स को इस पुस्तक को पढ़ने पर विचार करना चाहिए।
इस कमांड की ताकत यह है कि अंतिम परिवर्तन एक चरित्र, एक लाइन या पूरी फाइल पर काम करने वाली क्रिया हो सकती है। उदाहरण के लिए, आपके द्वारा इन्सर्ट मोड डालने के क्षण में एक बदलाव को सीमांकित किया जा सकता है और जिस क्षण आप वापस सामान्य मोड में जाते हैं।
यह ध्यान में रखते हुए यह करना आसान है कि आप मल्टीकलर के साथ क्या करना चाहते हैं:
पहले अपना वातावरण सेट करें: जैसा आपने सुझाव दिया है, वैसा लिखें
\section[]{}
फिर एक दोहराने योग्य परिवर्तन करें
कर्सर अब चालू है }
, चरित्र F[
पर वापस जाने के लिए मारा [
। उसके बाद इन्सर्ट मोड डालें i
और टाइप करें My first section in this book
और वापस सामान्य मोड में जाएँ ESC
:
\section[My first section in this book]{}
और यहां जादू का हिस्सा आता है: चलो चरित्र f{
पर कर्सर रखने के लिए टाइप करें {
और .
आखिरी बदलाव को दोहराने के लिए हिट करें:
\section[My first section in this book]{My first section in this book}
डॉट कमांड की सभी चुनौती यह है कि कैसे दोहराए जाने वाले बदलावों को सीखें: यह वीमिंग ग्रिम के साथ आएगा लेकिन मूल यह समझने के लिए है कि अपने बदलाव को कैसे रिपीटेबल तरीके से किया जाए।
उदाहरण के लिए एक पंक्ति के अंत में एक अर्द्ध बृहदान्त्र को सम्मिलित करने के लिए आप का उपयोग करना पसंद करेंगे
A;
बजाय $a;
। क्यों?
क्योंकि A;
जब आप .
दूसरी पंक्ति पर उपयोग करेंगे, तो कोई परमाणु क्रिया बनाता है , चाहे आप उस पंक्ति में हों जहाँ आप अंत में अर्ध उपनिवेश सम्मिलित करेंगे। जबकि उपयोग करते समय $a;
आप अपने परिवर्तन को दो भागों में विभाजित करते हैं $a
और ;
यदि आप इसका उपयोग .
करते हैं तो प्रविष्टि कर्सर की वर्तमान स्थिति पर अर्ध उपनिवेश को सम्मिलित करेगी।
नोट Vim में जादू सूत्र है n.
। वास्तव में अच्छा वर्कफ़्लो है:
- उस स्थान की खोज करें जिसे आप संपादित करना चाहते हैं
/pattern
- अपना दोहराव संपादित करें
n
संपादित करने के लिए अगली जगह पर जाने के लिए उपयोग करें
.
संपादन दोहराने के लिए उपयोग करें
- पिछले दो चरणों को दोहराएं: आप दुनिया के राजा हैं (या कम से कम संपादन)
मैक्रो
मैक्रोज़ विम में एक और बेहद महत्वपूर्ण उपकरण है क्योंकि यह आपको कीस्ट्रोक्स के अनुक्रम को रिकॉर्ड करने और इसे दोहराने की अनुमति देता है जैसे कि आप इसे फिर से टाइप करते हैं।
मैं उपयोग करूँगा, उदाहरण के लिए, आपका दूसरा उपयोग मामला:
variable1 = 2
my_variable2 = 12
var3 = 14
एक बार फिर से यह जानना महत्वपूर्ण है कि अपने मैक्रोज़ को कैसे कुशल बनाया जाए (मैं इसके बाद एक काउंटर उदाहरण दूंगा):
variable1.someStuff = 2
my_variable2 = 12
var3 = 14
- अब आप अपने संपादन को दोहराने के लिए मैक्रो का उपयोग कर सकते हैं। जैसा कि आप संपादित करने के लिए सही लाइन पर हैं, आप बस मैक्रो को निष्पादित कर सकते हैं
@q
। जैसा कि हम इसे दो बार निष्पादित करना चाहते हैं आप उपयोग कर सकते हैं 2@q
और आपको निम्न परिणाम प्राप्त होंगे:
variable1.someStuff = 2
my_variable2.someStuff = 12
var3.someStuff = 14
नोट 1 जैसा कि आपने देखा होगा, 0ea
मैक्रो की शुरुआत में उपयोग करना वास्तव में महत्वपूर्ण था। वास्तव में, यदि आपने मैक्रो को रिकॉर्ड करने और फिर से निष्पादित करने से पहले अपने कर्सर को पहले शब्द के अंत में रखा था, तो आपका परिणाम होगा:
variable1.someStuff = 2
my_variable2 = 12.someStuff
var3 = 14.someStuff
आपके कर्सर के रूप में टेक्स्ट को लाइन बदलने के बाद कर्सर की स्थिति में डाला जाएगा (यानी इस मामले में लाइन का अंत)
नोट 2 मैक्रोज़ बेहद शक्तिशाली हैं और जब आप उनके साथ सहज होते हैं तो आप पुनरावर्ती मैक्रोज़ भी बना सकते हैं। यहाँ आपका मैक्रो हो सकता है:
`0ea.someStuff<Esc>j@q`
फाइनल @q
ने मैक्रो का उपयोग करने के बजाय खुद को बुलाया होगा 2@q
; आपने अभी-अभी उपयोग किया है @q
और सभी काम हो गए होंगे।
दृश्य ब्लॉक
यहां एक और चाल है जो सीधे आपके उपयोग के मामले पर लागू नहीं होती है लेकिन एक ही समय में बड़ी संख्या में पंक्ति को संपादित करने के लिए वास्तव में उपयोगी हो सकती है। आइए, सीएसएस कोड के इस अर्क को प्राप्त करते हैं:
li.one a{ background-image: url('/images/sprite.png'); }
li.two a{ background-image: url('/images/sprite.png'); }
li.three a{ background-image: url('/images/sprite.png'); }
क्या होगा अगर आप से स्प्राइट ले जाया images
करने के लिए components
?
वैसे आप पर अपने कर्सर रख सकते हैं i
की images
और प्रेस <C-v>
। यह विज़ुअल ब्लॉक मोड शुरू करेगा जो ब्लॉक चुनने की अनुमति देता है। अब आप t/
उस शब्द का चयन करने के लिए टाइप कर सकते हैं जिसे आप बदलना चाहते हैं और 2j
शब्द की सभी घटनाओं का चयन करना चाहते हैं ।
उसके बाद आपको बस c
शब्द को बदलने के लिए टाइप करना होगा और फिर components
। जब आप सम्मिलित मोड से बाहर निकलेंगे, तो आप देखेंगे:
li.one a{ background-image: url('/components/sprite.png'); }
li.two a{ background-image: url('/components/sprite.png'); }
li.three a{ background-image: url('/components/sprite.png'); }
वैश्विक कमान
वैश्विक कमांड एक उपकरण है जो एक पैटर्न से मेल खाती लाइनों पर एक पूर्व मोड कमांड को लागू करने की अनुमति देता है, एक बार फिर से कई कर्सर की आवश्यकता के बिना अलग-अलग जगह पर एक ही बदलाव को लागू करने का एक अच्छा तरीका है।
सिंटैक्स निम्न है:
:[range] g / pattern / command
[range]
पैरामीटर पर अधिक जानकारी के लिए कृपया देखें :h :range
। मैं इसे यहाँ विस्तृत नहीं करूँगा, मैं बस याद दिलाता हूँ कि %
पूरी फ़ाइल का '<,'>
प्रतिनिधित्व करता है, अंतिम चयन का 1,5
प्रतिनिधित्व करता है , और फ़ाइल की 1 से 5 लाइनों का प्रतिनिधित्व करता है।
यह पैरामीटर उन लाइनों को परिभाषित करता है जिनका इलाज वैश्विक कमांड द्वारा किया जाएगा। यदि कोई सीमा निर्दिष्ट नहीं है, तो वैश्विक कमांड %
डिफ़ॉल्ट रूप से उपयोग करेगी ।
[पैटर्न] तर्क एक खोज पैटर्न है जैसा कि आप खोज इंजन के साथ उपयोग करने के लिए उपयोग किया जाता है। चूंकि यह खोज इतिहास को एकीकृत करता है इसलिए आप इस फ़ील्ड को खाली छोड़ सकते हैं और वैश्विक कमांड खोज इतिहास में अंतिम खोज पैटर्न का उपयोग करेगा।
अंत में [कमांड] पैरामीटर एक पूर्व कमांड है जैसा कि आप शायद उपयोग करते हैं।
अब वैश्विक कमांड का व्यवहार बहुत सरल है:
- [रेंज] पैरामीटर में परिभाषित सभी लाइनों के माध्यम से Iterate
- यदि वर्तमान लाइन परिभाषित पैटर्न से मेल खाती है, तो कमांड लागू करें
जैसा कि [कमांड] पैरामीटर एक पूर्व कमांड है, आप बहुत सारी चीजें कर सकते हैं। चलो निम्नलिखित छद्म कोड लेते हैं जो बहुत दिलचस्प नहीं है और बहुत सारे डीबगिंग संदेश हैं:
var myList = null
var i = 0
myList = new List()
echo "List instantiated"
for (i=0; i<10; i++)
myList.Add(i)
echo i . " added to the list"
echo "end of for loop"
अब कहते हैं कि आपको यकीन है कि यह कोड काम करता है और आप इन बेकार echo
बयानों को हटाना चाहते हैं :
आप अपनी वैश्विक कमांड को पूरी फाइल पर लागू कर सकते हैं ताकि आपको कमांड को पहले से निर्धारित करना पड़े %
(या %
डिफ़ॉल्ट सीमा के बाद कुछ भी नहीं है)।
आप जानते हैं कि आप जिन लाइनों को हटाना चाहते हैं वे सभी पैटर्न से मेल खाते हैं echo
आप इन पंक्तियों को हटाना चाहते हैं, इसलिए आपको उस कमांड का उपयोग करना होगा :delete
जिसे संक्षिप्त रूप में भी जाना जा सकता हैd
तो आपको बस निम्नलिखित फ़ंक्शन का उपयोग करना होगा:
:%global/echo/delete
जिसे संक्षिप्त भी किया जा सकता है
:g/echo/d
ध्यान दें कि %
गायब हो गया है, global
संक्षिप्त रूप में g
और के delete
रूप में है d
। जैसा कि आप सोच सकते हैं कि परिणाम है:
var myList = null
var i = 0
myList = new List()
for (i=0; i<10; i++)
myList.Add(i)
नोट 1 एक महत्वपूर्ण बिंदु जो मुझे महसूस करने में कुछ समय लगा वह यह है कि
normal
कमांड एक पूर्व कमांड है जिसका अर्थ है कि आप इसे वैश्विक कमांड के साथ उपयोग कर सकते हैं। यह वास्तव में शक्तिशाली हो सकता है: मान लें कि मैं उन सभी लाइनों की नकल करना चाहता हूं जिनमें गूंज है, मुझे मैक्रो या यहां तक कि जादू सूत्र की आवश्यकता नहीं है n.
। मैं बस उपयोग कर सकते हैं
:g/echo/normal YP
और वोइला:
var myList = null
var i = 0
myList = new List()
echo "List instantiated"
echo "List instantiated"
for (i=0; i<10; i++)
myList.Add(i)
echo i . " added to the list"
echo i . " added to the list"
echo "end of for loop"
echo "end of for loop"
नोट 2 "अरे क्या होगा यदि मैं अपनी कमांड का उपयोग उन लाइनों पर करना चाहता हूं जो एक विशिष्ट पैटर्न से मेल नहीं खाती हैं?"
global
एक विपरीत कमांड vglobal
संक्षिप्त रूप में v
काम करता है जो global
सिवाय इसके कि कमांड उन तर्ज पर लागू किया जाएगा जो [पैटर्न] पैरामीटर से मेल नहीं खाते हैं। इस तरह अगर हम आवेदन करें
:v/echo/d
हमारे पिछले उदाहरण पर हमें:
echo "List instantiated"
echo i . " added to the list"
echo "end of for loop"
delete
कमांड लाइन जो निहित नहीं था पर लागू किया गया है echo
।
यहाँ मुझे उम्मीद है कि उन कुछ संकेतों से आपको अपने मल्टी कर्सर प्लगइन से छुटकारा पाने के बारे में विचार मिलेगा और Vim का उपयोग Vim तरीके से होगा;;
जैसा कि आप कल्पना कर सकते हैं कि ये उदाहरण बहुत सरल हैं और बस यह प्रदर्शित करने के लिए बनाए गए हैं कि जब आप विम तरीके का पालन करते हैं तो आपको वास्तव में कई शापियों की आवश्यकता होती है। मेरी सलाह होगी कि जब आप ऐसी स्थिति का सामना करें, जहां आपको लगता है कि यह उपयोगी होगा, तो इसे लिखें और बेहतर समाधान खोजने के लिए कुछ समय बाद लें। समय का 99% आप अंततः इसे करने के लिए एक तेज / अधिक कुशल तरीका पाएंगे।
इसके अलावा मैं अपने आप को एक बार फिर दोहराऊंगा लेकिन मैं वास्तव में आपको ड्र्यू नील द्वारा प्रैक्टिकल विम पढ़ने के लिए प्रोत्साहित करता हूं
क्योंकि यह पुस्तक "कैसे करना है या विम में यह नहीं है" के बारे में है "यह विम के तरीके से कैसे सीखें" जो आपको अपने भविष्य की समस्याओं के लिए अपने स्वयं के समाधान का निर्माण करने की अनुमति देगा।
PS अपने संपादन कार्य के लिए @Alex स्ट्रैगीज़ और इस लंबे पद के लिए किए गए सुधारों के लिए विशेष धन्यवाद।