如何在vim中翻转可视选择区域的行?

21

我想要选中一段文本并将其翻转,使得该选择的第一行出现在底部。原始文本如下:

<other_stuff>
The
wheels
go
round.
<more_stuff>

可视化选择句子并翻转:

<other_stuff>
round.
go
wheels
The
<more_stuff>

如何简单地实现这个?我不想安装插件来完成它。


2
在[SU]上的重复问题:如何在vim中反转所选行的顺序? - Palec
4个回答

36
当您进行可视选择时,Vim会自动在块的开头和结尾处设置书签`'<`和`'>`,因此您可以通过几种方式完成想要的操作。
在普通模式下:`'>dd'
作为ex命令:`:'>d | '<-1 put`
请注意,书签在退出可视模式后仍然保留,因此您不必停留在可视模式下即可使用它们。
编辑: 哎呀,我误读了问题,并认为您只想将最后一行放在开头,但您要反转整个块。如果您在Unix系统上,则最简单的解决方案为:
:'<,'>!tac

这会将这些行通过Unix的“反向cat”程序处理。


12
在OS X上使用 tail -r 命令。 - silvenon
2
太好了!有时候 ! 可以节省很多时间! - Enlico

5

根据:help 12.4,您可以使用mt标记第一行,移动到要反转的最后一行,然后使用命令:'t+1,.g/^/m 't


请确保标记您不想移动的最后一行;而不是您想要移动的第一行。 - Alan

4

针对那些更喜欢使用可视化模式的人:

  1. 通过输入:set nu来查找要翻转的选区上方的行号。
  2. 使用Shift-V来高亮要翻转的选区(可视化模式)。
  3. :g/^/m <步骤1中的行号>

请注意,在可视化模式下,当您从步骤3输入命令时,它会自动显示为:'<,'>g/^/m <行号>

该命令通过逐行将所选内容移动到给定的行号来实现翻转。当第二个项目被推入给定的行号时,它会将第一个项目推到行号+1。然后第三个项目将第一个和第二个向下推,以此类推,直到整个列表都被推入单个行号,从而实现了反向排序的列表。


2

回答Dave Kirby的问题并满足“如何简单地完成此操作”的要求,您可以在.vimrc文件中创建一个快捷方式。以下示例将F5键映射到此快捷方式:

map <F5> :'<,'>!tail -r<CR>

或适用于OS X:

map <F5> :'<,'>!tac<CR>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接