2010-07-26 7 views
67

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

Last, First 

में

First Last 

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

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

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

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

+1

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

+0

क्यों विम? मेरी राय में sed अधिक अप्रासंगिक है। – kokosing

+7

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

उत्तर

124

मान लीजिए आप एक मैक्रो 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

': @q ="^wgU $ "' –

+0

@ रोगर पाट: ठीक है, हाँ अगर आप इसे गोल्फ करना चाहते हैं :) – rampion

+0

@ रैंपियन: क्या आपके आदेश में कोई टाइपो है? मेरे लिए यह केवल इस तरह काम करता है: ': <,'> सामान्य! @ q' – oliver

12

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

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

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

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

यदि आप प्रत्येक पंक्ति पर एक रिकॉर्ड किए गए मैक्रो को फिर से चलाने के लिए चाहते हैं तो आपको :normal कमांड के साथ मैक्रो निष्पादित करने की आवश्यकता है। दुर्भाग्यवश :normal कमांड लाइनों की एक श्रृंखला पर काम नहीं करता है, लेकिन आप :global कमांड के साथ इसे ठीक कर सकते हैं। यह हर पंक्ति है कि एक regex से मेल खाता पर एक :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 
+1

': सहायता: सामान्य-श्रेणी' –

+0

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

+0

[@ डेव, किर्बी] (https://stackoverflow.com/users/206417/dave-kirby) मैक्रो को केवल उन पंक्तियों पर चलाने के लिए '^' के साथ '^' का आदान-प्रदान करना बेहतर होगा, जिनमें कुछ टेक्स्ट है, नहीं है? – SergioAraujo

0

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

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

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

:Rover a 
संबंधित मुद्दे