如何将范围扩展到vimscript中的列表?

mer*_*011 5 vi vim

我想自动选择一个视觉选择的文本块,例如 51-100,并将其扩展为51,52,53,...,99,100.

在vimscript中有一个简单的方法吗?

ib.*_*ib. 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
Run Code Online (Sandbox Code Playgroud)

如果范围表示法保证数字周围没有空格,则ExpandRange()可以通过使用split()函数简化第二个语句,

    let n = split(@", '-')
Run Code Online (Sandbox Code Playgroud)

请注意,表示范围的文本将放入未命名的寄存器中.如果最好保持寄存器不变,请修改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
Run Code Online (Sandbox Code Playgroud)