如何删除隔行,加上选择后粘贴删除的结果?
这是question about deleting every second line in a file的后续行为。如何删除隔行,加上选择后粘贴删除的结果?
如何做到这一点的Vim的:
之前(说这是一个文件的VISUAL选择的一部分):
aaa
bbb
ccc
ddd
eee
fff
AFTER:
aaa
ccc
eee
bbb
ddd
fff
我该怎么办这个宏样式(每隔一行删除一行,但将已删除的行存入缓冲区,以便删除的行按顺序粘贴)?另外,如果你可以在一个VISUAL选择中做到这一点,那真的很方便(解析某个文件)!
当线重新排序存在于缓冲器中的唯一的,运行 命令
:g/^/+m$
通常,当这些线与其他的文本包围,一个可以 选择的目标范围行重新排序和运行
:exe"'<,'>g/^/+m"line("'>")
或选择所有的线重新排序,但他们的第一个和运行
:'<,'>-g/^/+m'<-
在任何一种情况下,重新排序都可以在一次运行中高效完成。
类型
:let @e=''<CR>
清空e
寄存器(假设你不关心它以前的内容)。将光标移到
aaa
。键入
qa
(或任何其他字母代替a
)来记录您的宏。类型
j"Edd
下降一行并删除它,而将它附加到e
注册。类型
q
停止录制直观地选择了整个事情。
将宏应用于
:'<,'>norm @a<CR>
,这会删除每隔一行。类型
"ep
。
您正式满意它是:一个宏,并使用视觉选择,所以信用在这里到期。 – 2012-07-09 03:30:30
@KevinLee:另请参阅我的[答案](http://stackoverflow.com/a/11362919/254635)中提出的Ex命令;他们也为视觉选择工作。此外,Ex命令更具通用性,因为它非易于交互使用(在映射或脚本中)。更不用说我提出的命令不会破坏寄存器的内容。 – 2012-07-09 03:51:34
为了记录,我同意@ ib。的评论:我发现他的答案是针对手头问题比我的更优雅和更智能的解决方案(通常情况下)。 – romainl 2012-07-09 05:58:39
你并不真的需要一个宏。
我们需要一个临时寄存器来放置结果,比如寄存器e
(如proposed by romainl)。
- 空寄存器(寄存器必须是空的,因为我们要使用大写寄存器,这意味着要追加,而不是覆盖)
:let @e=''
ENTER - 直观地选择面积上下工夫(即线
aaa
通过fff
) - 删除每秒线和追加该行注册
e
::g/^/+d E
现在,注册e
保存已删除内容 - 贴寄存器
e
在你需要它使用"ep
讨论
我们需要使用它之前清空寄存器,因为我们使用大写寄存器,这意味着要追加到寄存器(见命名寄存器上
:he registers
)型
:he :global
去了解更多的令人难以置信的强大:g
命令(它不是那么有用的朋友:v
实际答案的99%已经覆盖that可惜没接受但很好的回答你引用的问题。你唯一需要的延伸,是被删除的行积累扔掉,而不是(确切:存储在默认寄存器中的最后删除的行)
是的,链接命令的直接扩展可以很好地工作。然而,有一个Ex命令(呃,我已经构建了至少[two](http://stackoverflow.com/a/11362919/254635),事实上),在一次运行中完全解决了这个重新排序问题,而无需额外的相互作用。如果感兴趣,请查看我的[答](http://stackoverflow.com/a/11362919/254635)。 – 2012-07-07 14:19:32
感谢您的回答,这个变种比诉诸宏观更“清洁”。 – 2012-07-09 03:31:07
@KevinLee:这个答案只是试图将我的答案延伸到链接的问题。为了回答这个问题,我[构造](http://stackoverflow.com/a/11362919/254635)从头开始的一个新的命令比使用这个扩展或宏更“干净”。 – 2012-07-09 03:55:56
试试这个命令:
:'<,'>g/^/+m$
它将将它们移动到文件末尾。然后你可以轻松地将它们移回去。
感谢你和@eckes,我刚学过'+'技巧(':h search-offset')。这是一个美好的一天! – romainl 2012-07-06 08:13:02
你正式在这里赢得vim高尔夫!我不会说谎这是我会用的最多的 - 我把复选标记分配给romainl只是因为我说我想要它'宏观风格' – 2012-07-09 03:32:13
@KevinLee:实际上,它没有:这个命令部分解决了这个问题;您还应该计算将一半文本移回到应该位置所需的其他击键。对于一个干净的,单一运行的解决方案,请参阅我的[答案](http://stackoverflow.com/a/11362919/254635)中提出的最后一条命令。 – 2012-07-09 03:44:35
您拥有的第二个答案实际上是功能最齐全的。 – 2012-07-10 04:30:35