2

这是关于删除文件中每隔一行的问题的一种后续。

如何在 Vim 中实现:

前:

aaa
bbb
ccc
ddd
eee
fff

(比如说,它是视觉选择的一部分。)

后:

aaa
ccc
eee
bbb
ddd
fff

我怎样才能做到这种宏风格(删除每隔一行,但将已删除的行存储到缓冲区,以便按顺序粘贴已删除的行)?

此外,如果您可以在非常方便的视觉选择中执行此操作(解析某个文件)!

4

4 回答 4

3

1. 当要重新排序的行是缓冲区中唯一存在的行时,可以使用命令

:g/^/+m$

2. 通常,当这些行被其他文本包围时,可以选择要重新排序的目标行范围,然后运行

:exe"'<,'>g/^/+m"line("'>")

或选择除第一行之外的所有行重新排序,然后运行

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

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

于 2012-07-06T13:15:32.193 回答
2
  1. 键入:let @e=''<CR>以清空e寄存器(假设您不关心它以前的内容)。

  2. 将光标放在aaa.

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

  4. 键入j"Edd向下一行并将其删除,同时将其附加到e寄存器。

  5. 键入q以停止录制

  6. 直观地选择整个事物。

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

  8. 键入"ep

于 2012-07-06T06:10:12.473 回答
2

你真的不需要宏。

我们需要一个临时寄存器来将结果放入,比如寄存器e由 romainl 提议)。

  1. 清空寄存器(寄存器必须为空,因为我们将使用大写的寄存器名称,这意味着追加而不是覆盖)
    :let @e=''ENTER
  2. 直观地选择要处理的区域(即aaa通过的线条fff
  3. 每隔一行删除一次并将该行附加到 register e
    :g/^/+d E
    现在, registere保存已删除的内容
  4. 将寄存器粘贴e到您需要的地方"ep

讨论

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

  • 输入:he :globalgo 了解更多关于这个令人难以置信的强大:g命令的信息(而且它的用处也不少:v

  • 不幸的是,99% 的实际答案已经涵盖在您引用问题的未接受但很好的答案中。您需要的唯一扩展是累积已删除的行而不是将它们丢弃(确切地说:将最后删除的行存储在默认寄存器中)

于 2012-07-06T06:32:33.337 回答
2

试试这个命令:

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

它会将它们移动到文件的末尾。然后,您可以轻松地将它们移回。

于 2012-07-06T07:12:02.783 回答