Vim不能准确地复制正常模式指令

hc2pp10m  于 2023-04-12  发布在  其他
关注(0)|答案(1)|浏览(140)

我想做一个函数,它生成一个可变行数的文本块。文本应该如下所示:

1.wav
2.wav
3.wav
4.wav
...

我的函数看起来像这样:

function Rename(howmany)

    normal i1.wav
    normal yy

    let iter = 1
    while iter < a:howmany
        normal pp0^Ayy "^A is generated from <Ctrl-V> <Ctrl-A>
        let iter += 1
    endwhile

endfunction

使用:call Rename(5)生成的文本如下所示:

1.wav
1.wav
2.wav
2.wav
3.wav
3.wav
4.wav
4.wav
5.wav

注意重复的片段。如果我一次重新创建一个正常模式步骤(pp-粘贴行,0-转到行的开头,^A-递增数字,yy-拖动当前行以进行进一步复制)。
我做了一个快速修复,删除每隔一行。
该修复看起来像这样:

function Rename(howmany)

    normal i1.wav
    normal yy

    let iter = 1
    while iter < a:howmany
        normal pp0yy
        let iter += 1
    endwhile

    normal gg

    let iter = 1
    while iter < a:howmany
        normal dd
        normal 
        let iter += 1
    endwhile

endfunction

有谁知道为什么会发生这种情况?以及我如何解决这个问题,这样我就不必绕过主要问题。

r8uurelv

r8uurelv1#

问题的原因很容易发现:

normal pp0^Ayy
       ^^

没有ppyy,只有p。因此,pp将默认寄存器中的文本放置两次:

1.wav
1.wav
1.wav

而你只增加第二个:

1.wav
1.wav
2.wav

下一个循环将最后一行拉出来,再放两次:

1.wav
1.wav
2.wav
2.wav
2.wav

等等
删除无关的p将解决问题:

function! Rename(howmany)
    normal i1.wav
    normal yy
    let iter = 1
    while iter < a:howmany
        normal p0^Ayy
        let iter += 1
    endwhile
endfunction

相关问题