6

我保留了我参加的会议的日志。

每次会议:

  • 由一个空行分隔(-> 每个会议都是一个段落)
  • 多亏了一个表情被折叠
  • 包含带有相应标签的行:ACME、GMBH、SARL 等……</li>

当我想回顾与 ACME 等的所有会议时,

  • 我创建了一个暂存缓冲区(:%y,然后是:tabnew,然后是粘贴)
  • 并且我希望删除 ACME 没有显示的所有段落。

这是我有问题的地方。

我知道如何按行搜索/删除:

:v/ACME/d

但是我如何按段落来做到这一点(以便将整个段落保持在 ACME 的位置,而不是唯一的标签行)?

注意:模式 ACME 可以在这些段落中多次出现。

4

2 回答 2

7

这有效:

let @r="" | execute("g/acme/ normal \"Rdap") | %d | put r

它转到包含“acme”的每个段落,并将其删除附加到寄存器 r。然后删除所有内容并放入寄存器 r。

如您所见,基本技巧是使用大写字母寄存器添加,而不是替换其内容。这也需要在开始时重置寄存器,以丢弃以前的寄存器内容。

这适用于多次出现“acme”的段落,因为整个段落在第一次匹配后被删除,因此不再匹配。

于 2013-08-29T11:13:25.123 回答
3

我会用 awk 来做,在 vim 中你可以:

%!awk -v RS="" -v ORS="\n\n" '/ACME/' 

那么只有包含的段落ACME将被保留。

于 2013-08-29T10:20:11.640 回答