如何在Vim中反转所选行的顺序?


94

例如,如果我有四行,如下所示:

第一行
第二行
第三行
第四行

我想将它们反转为

第四行
第三行
第二行
第一行

我如何在Vim中做到这一点?



1
相关:在Vim Wikia上
撤消

1
:command! -bar -range=% Reverse <line1>,<line2>global/^/m<line1>-1 vi.stackexchange.com/a/2107/10254
qeatzy

Answers:


86

要反转文件中的所有行,

:g/^/m0

有关说明,请参见

:help 12.4

这也显示了如何只反转一定范围的线。


12
确切的帮助部分的一个很好的提示!总结一下:1.在要反转的最后一行上设置一个标记(我使用命名标记'a' ma),2.将光标移到该块的第一行,3.输入:'a,.g/^/m 'a
Brent Faust

68

选择所需的行,单击!,然后在出现的提示中将行通过tacla 传递:'<,'>!tac。请参阅man tac以获取更多详细信息。


4
要选择线条,请使用shift+v进入可视线条模式,然后j将线条添加到选择中。
威斯巴基2014年

我也可以通过确认这在Windows gvim中也可以使用!否则,您必须使用绝对行号(也许您可以使用相对行号,但必须小心)与:g/^/m0(这也确实很难记住)。因此,从本质上讲,不管使用什么平台,TAC都应该与vim一起使用你在,但不是100%vimscript,但在乎的人:P
dylnmc

tac并不是完全本机的vim处理程序,但是'm'ove命令使用行号,这并不总是合理的。我经常将标记用作范围的一部分,因此:.,'a!tac可以轻松完成工作。
studog

使用完后shift+v,您可以使用}直到下一段,或者留空垂直空间。另外,man tac: concatenate and print files in reverse
尼隆

33

在Mac OS X tac上不存在,但是可以使用tail -r达到相同的效果:

:%!tail -r

这对于可视模式也很好:

:'<,'>!tail -r

摘自tail(1)的联机帮助页:

-r选项使输入以相反的顺序逐行显示。此外,此选项更改-b,-c和-n选项的含义。指定-r选项时,这些选项指定要显示的字节,行或512字节块的数目,而不是指定从其开始显示的输入的开头或结尾的字节,行或块的数目。 -r选项的缺省设置是显示所有输入。


3
优秀的!因此,要在OS X下提供“ tac”:alias tac='tail -r'
Brent Faust

4
您也可以brew install coreutils使用gtac
Andrew Marshall

1
天才。没想到使用!用于这种类型的视线操纵的命令。
查理·达萨斯

3

对于那些更喜欢Visual模式的用户:
1.使用标识要翻转的选择上方的行号:set nu
2. Shift-V突出显示要翻转的选择(可视模式)。
3 :g/^/m <Line number from step 1>

请注意,在可视模式下,:'<,'>g/^/m <Line number>当您键入3中的命令时,它将自动显示 。

该命令通过将选择项每次移动一行到您提供的行号中来工作。当第二项推入给定的行号时,它将第一项向下推至行号+1。然后第三项将第一项和第二项向下推,依此类推,直到将整个列表推入单个行号,结果是反向排序列表。


4
您可以使用'<代替手动输入行号。只需提前开始选择一行并执行:'<,'>g/^/m'<
Palec

3

您的的命令:Rev[erse]和可选映射vimrc,因此您不必记住并执行此配方的非显而易见的步骤:

" Reverse the lines of the whole file or a visually highlighted block.
    " :Rev is a shorter prefix you can use.
    " Adapted from http://tech.groups.yahoo.com/group/vim/message/34305
command! -nargs=0 -bar -range=% Reverse
    \       let save_mark_t = getpos("'t")
    \<bar>      <line2>kt
    \<bar>      exe "<line1>,<line2>g/^/m't"
    \<bar>  call setpos("'t", save_mark_t)

nmap <Leader>r :Reverse<CR>
xmap <Leader>r :Reverse<CR>

:xmap映射为可视模式,但不映射为选择模式,因为:help mapmode-x建议映射可打印字符。)

(基于:http : //tech.groups.yahoo.com/group/vim/message/34305


这应该是IMO接受的答案。一般而言最有用,我不必记住:'<,'>g/^/m'<:)
艾略特(Eliot)

1
@艾略特,谢谢!); :)(我平添了几分“奖励内容”。)
阿龙托马

在这种情况下,怎么说怎么说开始-1?因为移动是从这一点开始的。
SergioAraujo

@SergioAraujo:是:-1,+1Rev您想要的东西吗?知道您可以直观地选择要反转的范围,例如:V7j:Rev。如果那不能回答您的问题,那么我听不懂,因此您需要为我详细说明或重新措词。
亚伦·托马

1

假设您在第3行,因此我们的范围是3到6。只需键入。

:3,6g/^/m2

1
您可以将当前行的数字保留为隐式:将光标放在范围的第一行上,可以缩短为:,6g/^/m2;或在范围的最后一行时::3,g/^/m2;并:3,6g/^/m2可以在文件中的任何位置工作。
亚伦·托马
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.