首页 > 解决方案 > 如何从 Vim 中交错行?

问题描述

给定一个包含偶数行的文件,如何将后半部分的行交错到前半部分?例如,从此:

a
b
c
1
2
3

对此:

a
1
b
2
c
3

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

:1,3w a | 4,6w b
:%!paste -d \\n a b

但是,我想在 Vim 中找到一种简单的方法——使用本机命令。

标签: vim

解决方案


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

考虑到我们在后半部分的第一行上有光标,这一行必须在前半部分的第一行之前,所以我们可以将它移动到那里:1 m -1 (将第 1 行移动到位置 -1,相对于光标)。在此之后,第 1 行现在应该在下半场的第 2 行之前。因此,只需向下移动光标并重复此过程,由 :g. 简而言之,先用50%and跳转到后半段的第一行,然后:

:,$g/^/1m-1

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

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

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


推荐阅读