如何删除隔行,加上选择后粘贴删除的结果?

问题描述:

这是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'<- 

在任何一种情况下,重新排序都可以在一次运行中高效完成。

+0

您拥有的第二个答案实际上是功能最齐全的。 – 2012-07-10 04:30:35

  1. 类型:let @e=''<CR>清空e寄存器(假设你不关心它以前的内容)。

  2. 将光标移到aaa

  3. 键入qa(或任何其他字母代替a)来记录您的宏。

  4. 类型j"Edd下降一行并删除它,而将它附加到e注册。

  5. 类型q停止录制

  6. 直观地选择了整个事情。

  7. 将宏应用于:'<,'>norm @a<CR>,这会删除每隔一行。

  8. 类型"ep

+0

您正式满意它是:一个宏,并使用视觉选择,所以信用在这里到期。 – 2012-07-09 03:30:30

+0

@KevinLee:另请参阅我的[答案](http://*.com/a/11362919/254635)中提出的Ex命令;他们也为视觉选择工作。此外,Ex命令更具通用性,因为它非易于交互使用(在映射或脚本中)。更不用说我提出的命令不会破坏寄存器的内容。 – 2012-07-09 03:51:34

+0

为了记录,我同意@ ib。的评论:我发现他的答案是针对手头问题比我的更优雅和更智能的解决方案(通常情况下)。 – romainl 2012-07-09 05:58:39

你并不真的需要一个宏。

我们需要一个临时寄存器来放置结果,比如寄存器e(如proposed by romainl)。

  1. 空寄存器(寄存器必须是空的,因为我们要使用大写寄存器,这意味着要追加,而不是覆盖)
    :let @e=''ENTER
  2. 直观地选择面积上下工夫(即线aaa通过fff
  3. 删除每秒线和追加该行注册e
    :g/^/+d E
    现在,注册e保存已删除内容
  4. 贴寄存器e在你需要它使用"ep

讨论

  • 我们需要使用它之前清空寄存器,因为我们使用大写寄存器,这意味着要追加到寄存器(见命名寄存器:he registers

  • :he :global去了解更多的令人难以置信的强大:g命令(它不是那么有用的朋友:v

  • 实际答案的99%已经覆盖that可惜没接受但很好的回答你引用的问题。你唯一需要的延伸,是被删除的行积累扔掉,而不是(确切:存储在默认寄存器中的最后删除的行)

+0

是的,链接命令的直接扩展可以很好地工作。然而,有一个Ex命令(呃,我已经构建了至少[two](http://*.com/a/11362919/254635),事实上),在一次运行中完全解决了这个重新排序问题,而无需额外的相互作用。如果感兴趣,请查看我的[答](http://*.com/a/11362919/254635)。 – 2012-07-07 14:19:32

+0

感谢您的回答,这个变种比诉诸宏观更“清洁”。 – 2012-07-09 03:31:07

+0

@KevinLee:这个答案只是试图将我的答案延伸到链接的问题。为了回答这个问题,我[构造](http://*.com/a/11362919/254635)从头开始的一个新的命令比使用这个扩展或宏更“干净”。 – 2012-07-09 03:55:56

试试这个命令:

:'<,'>g/^/+m$ 

它将将它们移动到文件末尾。然后你可以轻松地将它们移回去。

+0

感谢你和@eckes,我刚学过'+'技巧(':h search-offset')。这是一个美好的一天! – romainl 2012-07-06 08:13:02

+0

你正式在这里赢得vim高尔夫!我不会说谎这是我会用的最多的 - 我把复选标记分配给romainl只是因为我说我想要它'宏观风格' – 2012-07-09 03:32:13

+0

@KevinLee:实际上,它没有:这个命令部分解决了这个问题;您还应该计算将一半文本移回到应该位置所需的其他击键。对于一个干净的,单一运行的解决方案,请参阅我的[答案](http://*.com/a/11362919/254635)中提出的最后一条命令。 – 2012-07-09 03:44:35