例如,如果我有四行,如下所示:
第一行
第二行
第三行
第四行
我想将它们反转为
第四行
第三行
第二行
第一行
我如何在Vim中做到这一点?
:command! -bar -range=% Reverse <line1>,<line2>global/^/m<line1>-1
vi.stackexchange.com/a/2107/10254
例如,如果我有四行,如下所示:
第一行
第二行
第三行
第四行
我想将它们反转为
第四行
第三行
第二行
第一行
我如何在Vim中做到这一点?
:command! -bar -range=% Reverse <line1>,<line2>global/^/m<line1>-1
vi.stackexchange.com/a/2107/10254
Answers:
要反转文件中的所有行,
:g/^/m0
有关说明,请参见
:help 12.4
这也显示了如何只反转一定范围的线。
ma
),2.将光标移到该块的第一行,3.输入:'a,.g/^/m 'a
选择所需的行,单击!
,然后在出现的提示中将行通过tac
la 传递:'<,'>!tac
。请参阅man tac
以获取更多详细信息。
shift+v
进入可视线条模式,然后j
将线条添加到选择中。
gvim
中也可以使用!否则,您必须使用绝对行号(也许您可以使用相对行号,但必须小心)与:g/^/m0
(这也确实很难记住)。因此,从本质上讲,不管使用什么平台,TAC都应该与vim一起使用你在,但不是100%vimscript,但在乎的人:P
:.,'a!tac
可以轻松完成工作。
shift+v
,您可以使用}
直到下一段,或者留空垂直空间。另外,man tac: concatenate and print files in reverse
。
在Mac OS X tac
上不存在,但是可以使用tail -r
达到相同的效果:
:%!tail -r
这对于可视模式也很好:
:'<,'>!tail -r
摘自tail(1)
的联机帮助页:
-r选项使输入以相反的顺序逐行显示。此外,此选项更改-b,-c和-n选项的含义。指定-r选项时,这些选项指定要显示的字节,行或512字节块的数目,而不是指定从其开始显示的输入的开头或结尾的字节,行或块的数目。 -r选项的缺省设置是显示所有输入。
alias tac='tail -r'
brew install coreutils
使用gtac
。
对于那些更喜欢Visual模式的用户:
1.使用标识要翻转的选择上方的行号:set nu
。
2. Shift-V
突出显示要翻转的选择(可视模式)。
3 :g/^/m <Line number from step 1>
。
请注意,在可视模式下,:'<,'>g/^/m <Line number>
当您键入3中的命令时,它将自动显示
。
该命令通过将选择项每次移动一行到您提供的行号中来工作。当第二项推入给定的行号时,它将第一项向下推至行号+1。然后第三项将第一项和第二项向下推,依此类推,直到将整个列表推入单个行号,结果是反向排序列表。
'<
代替手动输入行号。只需提前开始选择一行并执行:'<,'>g/^/m'<
。
您的的命令: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
建议映射可打印字符。)
:'<,'>g/^/m'<
:)
:-1,+1Rev
您想要的东西吗?知道您可以直观地选择要反转的范围,例如:V7j:Rev
。如果那不能回答您的问题,那么我听不懂,因此您需要为我详细说明或重新措词。