这是关于删除文件中每隔一行的问题的一种后续。
如何在 Vim 中实现:
前:
aaa
bbb
ccc
ddd
eee
fff
(比如说,它是视觉选择的一部分。)
后:
aaa
ccc
eee
bbb
ddd
fff
我怎样才能做到这种宏风格(删除每隔一行,但将已删除的行存储到缓冲区,以便按顺序粘贴已删除的行)?
此外,如果您可以在非常方便的视觉选择中执行此操作(解析某个文件)!
这是关于删除文件中每隔一行的问题的一种后续。
如何在 Vim 中实现:
前:
aaa
bbb
ccc
ddd
eee
fff
(比如说,它是视觉选择的一部分。)
后:
aaa
ccc
eee
bbb
ddd
fff
我怎样才能做到这种宏风格(删除每隔一行,但将已删除的行存储到缓冲区,以便按顺序粘贴已删除的行)?
此外,如果您可以在非常方便的视觉选择中执行此操作(解析某个文件)!
1. 当要重新排序的行是缓冲区中唯一存在的行时,可以使用命令
:g/^/+m$
2. 通常,当这些行被其他文本包围时,可以选择要重新排序的目标行范围,然后运行
:exe"'<,'>g/^/+m"line("'>")
或选择除第一行之外的所有行重新排序,然后运行
:'<,'>-g/^/+m'<-
反而。在任何一种情况下,重新排序都可以在一次运行中有效地完成。
键入:let @e=''<CR>
以清空e
寄存器(假设您不关心它以前的内容)。
将光标放在aaa
.
键入qa
(或任何其他字母而不是a
)来记录您的宏。
键入j"Edd
向下一行并将其删除,同时将其附加到e
寄存器。
键入q
以停止录制
直观地选择整个事物。
使用 应用宏:'<,'>norm @a<CR>
,这将删除每隔一行。
键入"ep
。
你真的不需要宏。
我们需要一个临时寄存器来将结果放入,比如寄存器e
(由 romainl 提议)。
:let @e=''
ENTERaaa
通过的线条fff
)e
::g/^/+d E
e
保存已删除的内容e
到您需要的地方"ep
讨论
我们需要在使用它之前清空寄存器,因为我们使用大写的寄存器名称,这意味着附加到寄存器(参见命名寄存器一节:he registers
)
输入:he :global
go 了解更多关于这个令人难以置信的强大:g
命令的信息(而且它的用处也不少:v
不幸的是,99% 的实际答案已经涵盖在您所引用问题的未接受但很好的答案中。您需要的唯一扩展是累积已删除的行而不是将它们丢弃(确切地说:将最后删除的行存储在默认寄存器中)
试试这个命令:
:'<,'>g/^/+m$
它会将它们移动到文件的末尾。然后,您可以轻松地将它们移回。