विम में, मैं लाइनों के एक सेट पर मैक्रो कैसे लागू कर सकता हूं?


222

मेरे पास लाइनों का एक गुच्छा के साथ एक फ़ाइल है। मैंने एक मैक्रो रिकॉर्ड किया है जो एक लाइन पर एक ऑपरेशन करता है। मैं फ़ाइल में शेष सभी लाइनों पर उस मैक्रो को दोहराना चाहता हूं। क्या ऐसा करने का कोई त्वरित तरीका है?

मैंने Ctrl + Q की कोशिश की, लाइनों के एक सेट को उजागर किया, और @@ दबाया, लेकिन वह चाल नहीं लगा।


ऑफटॉपिक प्रश्न: मुझे VIM मैक्रोज़ के बारे में पता नहीं था (या अवगत नहीं होना चाहता था: P) क्या आपके पास VIM मैक्रोज़ पर कुछ अच्छे "आलसी पाठक" उन्मुख लिंक हैं?
ऑस्कररेज़

ज़रूर, यह: अजवायन। Com / mac / blog / 2006 / 07/… इसे बहुत अच्छी तरह से गाया जाता है
जॉर्डन पैरामर

आप यह भी देख सकते हैं: वह जटिल-दोहराने के अंदर से
सैम

जवाबों:


354

कई / सभी लाइनों पर मैक्रो को निष्पादित करने के लिए पूर्व मोड में सामान्य कमांड का उपयोग करें :

रजिस्टर में संग्रहीत मैक्रो निष्पादित एक 10 के माध्यम से लाइनों 5 पर।

:5,10norm! @a

रजिस्टर में संग्रहीत मैक्रो निष्पादित एक फ़ाइल के अंत के माध्यम से लाइनों 5 पर।

:5,$norm! @a

रजिस्टर में संग्रहीत मैक्रो निष्पादित एक सभी लाइनों पर।

:%norm! @a

रजिस्टर में मैक्रो दुकान निष्पादित एक मिलान सभी लाइनों पर पैटर्न

:g/pattern/norm! @a

नेत्रहीन चयनित लाइनों, प्रेस पर मैक्रो निष्पादित करने के लिए वी और j या कश्मीर जब तक वांछित क्षेत्र चुना गया है। फिर टाइप करें :norm! @aऔर निरीक्षण करें कि निम्नलिखित इनपुट लाइन दिखाई गई है।

:'<,'>norm! @a

दर्ज करें : अधिक पढ़ने के लिए विम में सामान्य मदद करें ।


1
हाँ,: vim या मेरे द्वारा जोड़े गए लिंक में सामान्य मदद करें।
न्यायाधीश मेग्गार्डन

1
एक साथी गैर emacs उपयोगकर्ता की मदद करने के लिए कुछ भी!
न्यायाधीश मेग्गार्डन

48
अच्छा !! शुरुआती टिप: अपनी इच्छित लाइनों को हाइलाइट करने के लिए V तब j / k का उपयोग करें, फिर बस टाइप करें:norm! @a
केविन बॉरबिलियन

7
@ केविनबोरिलियन से बहुत उपयोगी टिप को जोड़ने के लिए, :लाइनों को हाइलाइट करने के बाद दबाने पर, एक्स इनपुट लाइन इसके बजाय पढ़ेगी :'<,'>जिसमें आप केविन द्वारा सुझाए गए बाकी हिस्सों को जोड़ देंगे। यह अंतिम कमांड को पढ़ेगा :'<,'>norm! @a:।
Deiwin

3
@GabeMoothart !कुंजियों के उपयोगकर्ता पुनरावृत्ति से बचा जाता है। आपको इसकी आवश्यकता नहीं हो सकती है, लेकिन एक उत्तर जो सभी के लिए काम करता है, उसे इसकी आवश्यकता होती है।
जज मेगार्डन

60

सभी पैटर्न पर 'पैटर्न' वाले मैक्रो 'ए' को चलाने के लिए वैश्विक का उपयोग करें

:g/pattern/normal! @a

मदद के लिए, जाँच करें :help global:।


4
भविष्य के उपयोगकर्ताओं के लिए स्पष्टीकरण के लिए: यह एक वैश्विक पूर्व कमांड है।
एटीपी

39

आप यह भी कर सकते हैं:

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

[number of times to apply the macro] @ [register]

उदाहरण के लिए:

1000@q

मैक्रो को रजिस्टर q में अगले 1000 लाइनों में जोड़ता है।

अपडेट: स्वीकृत उत्तर बहुत बेहतर है

अपडेट: जैसा कि @kevinliu ने बताया, आप संभवतः jअगली पंक्ति में जाने के लिए मैक्रो को समाप्त करना चाहते हैं।


4
यह अंतिम पंक्ति पर रुकता है, और अंतिम पंक्ति पर कई बार निष्पादित नहीं होता है, जिससे मैं डरता था।
हुब्रो

@ हुब्रो, अन्य उपयोगकर्ताओं के इन जवाबों ने मेरे लिए काम किया: :%norm! @aऔरvGG :norm! @a
मैक्स हाइबर

2
किसी कारण के लिए, यह अजीब काम किया, और स्वीकृत उत्तर नहीं दिया। मेरे मैक्रो में एक नई लाइन सम्मिलित करना, सामान करना और अगली पंक्ति में जाना शामिल है।
jasonszhao

@ajonszhao ने भी यहीं किया। लेकिन वैसे भी 1000 नहीं बल्कि अंत तक सभी पंक्तियों को कहने के लिए है .. और फिर भी नई लाइन का ध्यान रखना, सामान करना, आदि
ihightower

2
मुझे लगता है कि यह इंगित किया जाना चाहिए कि आपका मैक्रो jअगली पंक्ति में जाने के लिए एक कमांड के साथ समाप्त होना चाहिए अन्यथा यह उसी लाइन पर लागू करने का प्रयास करेगा।
केविन लियू

2

वहाँ भी एक प्लगइन है, जिसे रेंजमैक्रो कहा जाता है, वही करता है जो आप चाहते हैं! हर कोई जो नाम से अनुमान नहीं लगा सकता है, वह क्या करता है: यह किसी दिए गए रेंज में प्रत्येक पंक्ति के लिए रिकॉर्ड किए गए मैक्रो को दोहराता है, भले ही दृश्य चयन या: 40,50 /: +10 तक कोई फर्क नहीं पड़ता

Http://www.vim.org/scripts/script.php?script_id=3271 देखें

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