如何在Vim内交错行?

sid*_*yll 3 vim

给定一个具有偶数行的文件,如何将第二半的行交错到前半部分?例如,从这个:

a
b
c
1
2
3
Run Code Online (Sandbox Code Playgroud)

对此:

a
1
b
2
c
3
Run Code Online (Sandbox Code Playgroud)

一种可能的解决方案是将这些一半写入分离的文件,然后使用该paste实用程序.

:1,3w a | 4,6w b
:%!paste -d \\n a b
Run Code Online (Sandbox Code Playgroud)

但是,我想在Vim中找到一个简单的方法 - 使用本机命令.

sid*_*yll 6

:g命令经常用于迭代行并执行一些命令.在这种情况下,它可以用于迭代文件后半部分的行,同时将行从前半部分移动到适当的相对位置:m.

考虑到我们将光标放在第二行的第一行,此行必须在前半部分的第一行之前,因此我们可以将其移动到那里:1 m -1 (将第1行移动到位置-1,相对于光标).在此之后,第1行现在应该在第二行的第二行之前.因此,需要将光标向下移动并重复此过程,方便地执行 :g.简而言之,首先跳到下半场的第一线50%然后:

:,$g/^/1m-1
Run Code Online (Sandbox Code Playgroud)

作为一个命令,它将整个块的范围隔行扫描(两半)或默认为整个文件:

command! -range=% Interleave execute 'keeppatterns'
            \ (<line2>-<line1>+1)/2+<line1> ',' <line2>
            \ 'g/^/<line1> move -1'
Run Code Online (Sandbox Code Playgroud)
:Interleave
Run Code Online (Sandbox Code Playgroud)

注意: :Interleave 用于 :keeppatterns防止搜索寄存器和历史记录发生变化.:keeppatterns 需要Vim 7.4.083+