2012-01-25 46 views

回答

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