विजुअल सेलेक्शन की हर लाइन पर मैक्रों का प्रदर्शन


85

मैं चयन में प्रत्येक पंक्ति पर एक मैक्रो चलाना चाहता हूं, बजाय मेरे सिर में लाइनों की संख्या को पूरा करने के। उदाहरण के लिए, मैं एक मैक्रो को बदलने के लिए लिख सकता हूं:

Last, First

में

First Last

और मैं चाहूंगा कि यह इन सभी लाइनों पर चले:

Stewart, John 
Pumpkin, Freddy
Mai, Stefan
...

कोई विचार विम गुरु?

संपादित करें: यह सिर्फ एक उदाहरण है, जाहिर है यह तुच्छ regexable है, लेकिन ऐसे अन्य उदाहरण हैं जो सामने आते हैं कि यह इतना आसान नहीं है कि मैं मैक्रोज़ का उपयोग करना पसंद करूंगा।


1
ईमानदार होने के लिए, मैं शायद इस विशेष कार्य को रेगेक्स के साथ करूंगा। लेकिन प्रश्न अभी भी अधिक जटिल मामलों के लिए मान्य है।
जेमी वोंग

क्यों विम? मेरी राय में सेड अधिक आश्रित है।
जूल

8
@kogut: एक पंक्ति regex के साथ अपने पाठ को संपादित करने के लिए अपने संपादक से बाहर क्यों?
स्टीफन

1
ठीक है, आपको वह बात मिल गई है;)
२०:०२ पर

जवाबों:


152

मान लीजिए कि आपके पास एक मैक्रो है qजो एक लाइन पर चला (और रहा)। तब आप इसे अपने चयन में हर लाइन पर चला सकते थे:

:'<,'>normal @q

(यदि आपके पास पहले से ही चयनित लाइनों का एक समूह है, तो कमांड लाइन पर हिट का :उत्पादन :'<,'>होता है)

उदाहरण के लिए, निम्नलिखित मैक्रो प्रत्येक शब्द को कैपिटल करता है लेकिन एक लाइन पर पहला:

:let @q="^dwgU$P"

तो इसे निम्नलिखित पर चलाएं (जहां +लाइनें चुनी गई हैं)

 0000: a long long time ago
 0001: in a galaxy far away
+0002: naboo was under an attack
+0003: and i thought me and qui-gon jinn
+0004: could talk the federation in
 0005: to maybe cutting them a little slack.

उपरोक्त normal @qआदेश के साथ, उत्पादन:

 0000: a long long time ago
 0001: in a galaxy far away
 0002: naboo WAS UNDER AN ATTACK
 0003: and I THOUGHT ME AND QUI-GON JINN
 0004: could TALK THE FEDERATION IN
 0005: to maybe cutting them a little slack.

6
:let @q="^wgU$"

1
@ क्रैम्पियन: क्या आपकी कमांड में कोई टाइपो है? मेरे लिए यह केवल इस तरह से काम करता है::'<,'>normal! @q
जैतून जूल 23'11

3
@oliver: अपने मैपिंग की जांच करें - आपने रीमैप किया होगा @q। से :help normal- "यदि [!] दिया जाता है, तो मैपिंग का उपयोग नहीं किया जाएगा।"
प्राचीर

2
@ क्रोध: लानत है ... तुम सही हो! मैं yankring का उपयोग करता हूं और स्पष्ट रूप से इस के साथ एक समस्या है: ... आप ": normal @a" के साथ मैक्रो निष्पादित नहीं कर सकते। : यह अभी भी संभव नहीं है, लेकिन उसे अपने साथ निष्पादित कर सकते हैं "सामान्य @a!" (Yankring की मदद डॉक्स से)
ओलिवर

1
मैं व्यक्तिगत रूप से @इस तरह दृश्य मोड में मैप करना पसंद करता हूं vnoremap @ :normal @:। इस तरह आप अभी भी कर सकते हैं @aजैसे आप उम्मीद थी (आप में प्रवेश बाद में :( हिट करने के लिए है, हालांकि)
LondonRob

19

लाइनों का चयन करें फिर :कमांड मोड दर्ज करने के लिए दबाएं । विम स्वचालित रूप से भर जाएगा '<,'>, जो चयनित लाइनों के लिए सीमा को सीमित करता है। अपने उदाहरण के लिए आप :sस्वैप करने के लिए कमांड का उपयोग कर सकते हैं :

:'<,'>s/\(\w\+\), \(\w\+\)/\2, \1/

यह दृश्य चयन में प्रत्येक पंक्ति पर अल्पविराम द्वारा अलग किए गए दो शब्दों को स्वैप करेगा।

आप किसी अन्य बुकमार्क या लाइन स्थिति का उपयोग '<और '>पसंद भी कर सकते हैं , जैसे कि एक आंदोलन कमांड के हिस्से के रूप में, इसलिए सामान्य मोड d'<में वर्तमान कर्सर स्थिति से दृश्य चयन में पहली पंक्ति की शुरुआत तक हटा दिया जाएगा। यदि ब्लॉक अब नेत्रहीन रूप से हाइलाइट नहीं किया गया है तब भी निशान प्रभावी रहते हैं।

यदि आप हर लाइन पर रिकॉर्ड किए गए मैक्रो को फिर से खेलना चाहते हैं, तो आपको :normalकमांड के साथ मैक्रो को निष्पादित करना होगा । दुर्भाग्य से :normalकमांड कई लाइनों पर काम नहीं करता है, लेकिन आप इसे :globalकमांड के साथ ठीक कर सकते हैं । यह :exप्रत्येक पंक्ति पर एक कमांड चलाता है जो रेगेक्स से मेल खाता है, इसलिए आप ऐसा कर सकते हैं:

:'<,'>g/^/ norm @a

स्पष्टीकरण:

:'<,'>       for every line in the visual block
g/^/         on every line that matches the regex /^/ - i.e. every line
norm         run in normal mode
@a           the macro recorded in a

यह स्वीकृत उत्तर से बेहतर है क्योंकि यह मैक्रोज़ का समर्थन करता है जो नई लाइनें जोड़ते हैं।
जन वारचोल

@ क्या, किर्बी शायद मैक्रो रन के ^साथ आदान- प्रदान .करने के लिए बेहतर होगा जो केवल कुछ पाठ है, नहीं होगा?
18-08 में सर्जियोअराज़ो

1

आप अपने नीचे दिए गए फ़ंक्शन को जोड़ सकते हैं ~/.vimrcया बस इसे अपने ब्राउज़र और कॉपी पर चला सकते हैं:@+

fun! RunMacroOverSelection(macroname)
    execute "'<,'>normal @". a:macroname
endfun
com -nargs=1 Rover :call RunMacroOverSelection(<f-args>)
nnoremap <leader>r :Rover<space>

लाभ यह है कि आप दृश्य चयन पर किसी भी मैक्रो को लागू कर सकते हैं। आपको मैक्रो पत्र को तर्क के रूप में देने की आवश्यकता है, जैसे:

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