如何在 vimscript 中将范围扩展为列表?

发布于 2024-12-28 22:40:23 字数 126 浏览 1 评论 0原文

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

在 vimscript 中有一个简单的方法可以做到这一点吗?

I'd like to automatically take a visually selected block of text, such as
51-100, and have it expanded into 51,52,53,...,99,100.

Is there an easy way to do this in vimscript?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

§对你不离不弃 2025-01-04 22:40:23

让我提出以下实施方案。

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

Let me propose the following implementation.

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

If it is guaranteed by the range notation that there is no whitespace around
numbers, the second statement of ExpandRange() can be simplified by using
the split() function,

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

Note that the text denoting a range is put into the unnamed register. If it
is preferable to leave the register untouched, modify ExpandRange() to save
its state beforehand and restore it afterwards.

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文