2012-01-25 41 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