将以下匹配的行移动到文件的顶部

时间:2011-07-01 22:56:15

标签: vim

我有一个大型文本文件,其中包含对特定函数method_name的几次调用。

我使用:g/method_name匹配了它们。

如何将它们移动到文件的顶部(第一个匹配位于顶部)?

我尝试了:g/method_name/normal ddggP,但这反过来了。有没有更好的方法来按顺序直接剪切和粘贴所有匹配的行?

示例输入文件:

method_name 1
foo
method_name 2
bar
method_name 3
baz

示例输出文件:

method_name 1
method_name 2
method_name 3
foo
bar
baz

3 个答案:

答案 0 :(得分:5)

如何以相反的方式尝试:将不匹配的线移到底部:

:v/method_name/normal ddGp

这似乎达到了你想要的效果。

答案 1 :(得分:4)

我认为您可以通过首先创建分配的变量来实现所需的结果 到0:

:let i=0

然后执行此命令:

:g/method_name/exec "m ".i | let i+= 1

它基本上调用:m作为地址传递 i 的值,然后递增 该值为1,因此可以在下一场比赛中使用。似乎工作。

当然,您可以在不再需要时删除该变量:

:unlet i

答案 2 :(得分:1)

如果文件非常大,匹配条目的数量很少,并且您不想使用解决方案v/<pattern>/ m$移动整个文件,您可以这样做:

选择你不关心的任何标记,比如'k。现在,以下键序列可以满足您的需求:

ggmk:g/method_name/ m 'k-1

  • ggmk标有'k的第一行。
  • m 'k-1'k标记之前将匹配行移动到1行(并且标记向下移动,并附加到其附近的行)。

这只会移动几条匹配的行,而不是整个文件。

注意:即使第一行包含模式,这种方法仍然有效 - 而且我没有解释。

对于脚本:

normal ggmk
g/method_name/ m 'k-1