2012-01-25 9 views
5

मैं 51-100 जैसे टेक्स्ट का एक दृश्यमान रूप से चयनित ब्लॉक लेना चाहता हूं, और इसे 51,52,53,...,99,100 में विस्तारित करना है।मैं एक श्रेणी को विस्क्रिप्ट में एक सूची में कैसे विस्तारित करूं?

क्या विस्क्रिप्ट में ऐसा करने का कोई आसान तरीका है?

उत्तर

8

मुझे निम्नलिखित कार्यान्वयन का प्रस्ताव दें।

vnoremap <silent> <leader># :<c-u>call ExpandRange()<cr> 
function! ExpandRange() 
    norm! gvy 
    let n = matchlist(@", '\(\d\+\)\s*-\s*\(\d\+\)')[1:2] 
    if len(n) != 2 || +n[0] > +n[1] 
     return 
    end 
    exe 'norm! gvc' . join(range(n[0], n[1]), ',') 
endfunction 

यह सीमा अंकन संख्या के आसपास कोई खाली स्थान के है कि वहाँ की गारंटी है, तो ExpandRange() के दूसरे बयान, split() फ़ंक्शन का उपयोग करके सरल किया जा सकता

let n = split(@", '-') 

ध्यान दें कि पाठ एक श्रेणी को इंगित करना अनाम नाम में डाल दिया जाता है। यदि यह रजिस्टर को छूने के लिए बेहतर है, ExpandRange() को को पहले से ही सहेजने के लिए संशोधित करें और इसे बाद में पुनर्स्थापित करें।

function! ExpandRange() 
    let [qr, qt] = [getreg('"'), getregtype('"')] 
    norm! gvy 
    let n = matchlist(@", '\(\d\+\)\s*-\s*\(\d\+\)')[1:2] 
    call setreg('"', qr, qt) 
    if len(n) != 2 || +n[0] > +n[1] 
     return 
    end 
    exe 'norm! gv"_c' . join(range(n[0], n[1]), ',') 
endfunction