वांछित स्थान पर कई कर्सर


14

मैं vim-एकाधिक-कर्सर प्लग इन का उपयोग कर रहा हूं ।

मैं जहां चाहूं वहां शाप देना चाहता हूं। उदाहरण के लिए ( [x]कर्सर स्थिति हैं):

Lorem ipsum dolor sit amet[1], consectetur adipiscing elit, 
sed do eiusmod tempor incididunt ut labore et dolore magna[2]
aliqua.

में उदात्त पाठ मैं सामान्य रूप से, पहले कर्सर रखें तो तीर कुंजी के साथ अगले स्थिति के लिए जा सकते हैं और एक दूसरे के जाते थे।

क्या वीआईएम में भी कुछ ऐसा ही है? इस प्लगइन या किसी अन्य के साथ।

संपादित करें

एक टिप्पणी के बाद, ऐसा करने में मेरी रुचि
\section[My first section in this book]{My first section in this book}
एक .texफ़ाइल में लिखने की कोशिश करते समय दिखाई दी । मेरी पहली प्रतिक्रिया लिखने के लिए था \section[]{}और उसके बाद क्रम के अंदर एक ही बात लिखने के लिए दो कर्सर डाल []और {}

अन्य _someStuffविभिन्न चर नामों के बाद अन्य उदाहरण जोड़ना होगा । उदाहरण के लिए, इसे चालू करें:

variable1 = 2
my_variable2 = 12
var3 = 14

इस मामले में:

variable1_someStuff = 2
my_variable2_someStuff = 12
var3_someStuff = 14

कई कर्सरों के साथ मैं एक कॉलम कर्सर का चयन करके और फिर शब्द के अंत में जा सकता हूं, फिर सम्मिलित कर सकता हूं, आदि, लेकिन मुझे लगता है कि मुझे वही चुनना आसान होगा जहां मैं कर्सर चाहता हूं।



1
मुझे लगता है कि एक महत्वपूर्ण सवाल यह है कि आप ऐसा क्यों करना चाहते हैं? तुम क्या करने की कोशिश कर रहे हो? कई कर्सर का उपयोग करना वास्तव में "विम तरीका का पालन करना" नहीं है, शायद एक अलग तरीका है जो आप चाहते हैं, कम से कम कुशल, अंतर्निहित सुविधाओं का उपयोग करके।
statox

@statox। संपादित देखें। मैंने दो उदाहरण दिए जो मेरे दिमाग में आए। दूसरा जो मैं विम-मल्टीपल-कर्सर प्लग के साथ पूरा कर सकता हूं, लेकिन पहला जो मैं नहीं कर सकता, कम से कम एक आसान तरीके से।
टोमसैनी

@ Nobe4। धन्यवाद, दूसरी स्क्रिप्ट ने इसे बनाया।
टोमसैनी

जवाबों:


30

कई कर्सर का उपयोग करना एक विमर बात नहीं है

जैसा कि मैंने मल्टी कमर्स (यहां तक ​​कि एक प्लगइन के साथ) का उपयोग करते हुए टिप्पणियों में कहा था, "विम तरीका का पालन करना" वास्तव में नहीं है, मैं पूरी तरह से समझता हूं कि यह उदात्त-पाठ से आने वाले किसी व्यक्ति के लिए आकर्षक है, लेकिन आप अक्सर ऐसे विकल्प पा सकते हैं जो कम से कम हैं अंतर्निहित सुविधाओं के साथ विम के रूप में कुशल।

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

यह अच्छा है लेकिन मैं एक वैकल्पिक तरीका कैसे खोज सकता हूं?

इसका कोई सार्वभौमिक उत्तर नहीं है क्योंकि यह इस बात पर बहुत निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं, मैं सिर्फ कोशिश करने के लिए पहली चीजों के बारे में कुछ संकेत देने की कोशिश करूंगा:


डॉट कमांड .

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

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

यह ध्यान में रखते हुए यह करना आसान है कि आप मल्टीकलर के साथ क्या करना चाहते हैं:

  • पहले अपना वातावरण सेट करें: जैसा आपने सुझाव दिया है, वैसा लिखें

    \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और अपने मैक्रो को रिकॉर्ड करना शुरू करें qq। इसका मतलब है "रजिस्टर में मेरे भविष्य के सभी कीस्ट्रोक्स रिकॉर्ड करना शुरू करें q"।

  • अपना संपादन लिखना प्रारंभ करें:

    • 0 लाइन की शुरुआत में जाने के लिए
    • e पहले शब्द के अंत में जाने के लिए
    • a अपने कर्सर के बाद संलग्न करने के लिए
    • .someStuff वांछित पाठ को जोड़ना
    • <Esc> प्रविष्टि को रोकने के लिए
    • j अगली पंक्ति पर जाने के लिए
    • q मैक्रो रिकॉर्ड करना बंद करने के लिए
  • आपको मिलेगा:

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 स्ट्रैगीज़ और इस लंबे पद के लिए किए गए सुधारों के लिए विशेष धन्यवाद।


बहुत पूरा जवाब। मैं वास्तव में उन सभी आदेशों को जानता था, लेकिन उन्हें इस तरह उपयोग करने के बारे में कभी नहीं सोचा था ... मुझे लगता है कि मुझे अधिक अभ्यास की आवश्यकता है। हालाँकि, मुझे कहना होगा कि कभी-कभी 'विम-वे' कुछ प्लगइन का उपयोग करने की तुलना में अधिक समय लेता है (उदाहरण के लिए, आपका सीएसएस उदाहरण आपके द्वारा बताए गए प्लगइन के साथ बहुत जल्दी किया जा सकता है), और कभी-कभी यह बहुत कम लगता है (वास्तव में, विशाल) अधिकांश समय vim किसी भी टेक्स्ट एडिटर की तुलना में तेज़ है, अगर इसे ठीक से इस्तेमाल किया जाए)।
टमाटर

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

1
@tomasyany: वास्तव में कभी-कभी "विम तरीका" का उपयोग करने में अधिक समय लग सकता है (मैं गिन नहीं सकता कि मैं एक कार्यशील मैक्रो बनाने में अधिक समय बिताता हूं अगर मैंने मैन्युअल रूप से परिवर्तन किए थे) लेकिन अभ्यास के साथ यह अंततः तेज हो जाता है। मैं केवल एक वर्ष के लिए विम का उपयोग कर रहा हूं और मैं एक विशेषज्ञ होने से बहुत (बहुत) दूर हूं लेकिन मैं महसूस कर सकता हूं कि मेरे अभ्यास के रूप में मेरे संपादन में लगातार सुधार होता है।
statox

1
शायद gnपाठ वस्तु का भी उल्लेख करना चाहिए । यह कई कर्सर के कुछ उपयोग मामलों को संबोधित करता है। युक्त खोज /तो, dgnया cgn, फिर साथ दोहराने .
जस्टिन एम। कीज़

@ जस्टिन मैं वास्तव में परिचित नहीं हूँ मैं इसे आज़माऊँगा gnऔर इसके बाद जोड़ दूँगा। सिर के लिए धन्यवाद!
statox

5

आपके दिए गए उपयोग के मामले मुझे .महत्वपूर्ण कमांड जानना चाहते हैं (पिछले एडिटिंग कमांड को दोहराएं)

  • पहले स्थान पर जाएं i, अपना टेक्स्ट डालें,<ESC>
  • स्थान 2 पर जाएं, प्रेस .(डॉट) ==> पहचान पाठ डाला जाता है
  • यहां एक पंक्ति नीचे जाने के लिए और फिर से सम्मिलित करें (जब लगातार लाइनों में डालें), दबाएं <ALT>-j.

मेरे लिए आपका टेक्स उदाहरण द्वारा हल किया गया है:

I\section[]{}<ESC>hhiMy first Sec...<ESC>lll.


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

1
खैर, आपका सवाल (वांछित उपयोग-मामलों को जोड़ने के बाद) ने मुझे याद दिलाया "मुझे वास्तव में मेरी कैंची पसंद है, और उनके साथ एक पेंच कसना चाहते हैं। मुझे बताएं कि कैसे"। और मैं आपको एक पेचकश के लिए एक निफ्टी उपयोग की ओर इशारा करता हूं;) (मैंने जवाब के रूप में जोड़ा, क्योंकि मुझे नहीं पता, टिप्पणियों में प्रारूपण कैसे करना है)
एलेक्स स्ट्रैगीज़

4

अधिक विम तरीके।

पहला काम:

\section[foobar baz]{foobar baz}

कार्यप्रवाह:

\section[]{}
hh
ifoobar baz<Esc>
$.

दूसरा काम:

variable1 = 2
my_variable2 = 12
var3 = 14

कमान:

3:norm ea_somestuff

परिणाम:

variable1_somestuff = 2
my_variable2_somestuff = 12
var3_somestuff = 14
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.