Vim-在粘贴之前/之后对寄存器的内容进行排序?

Vim-在粘贴之前/之后对寄存器的内容进行排序?,vim,Vim,作为我的一个项目的一部分,我试图将某些行从文件移到顶部,以某种方式排序。我不知道这些行出现后如何排序-我不想干扰文件中的其他行 我通过猛拉它们并将它们放下来移动它们,就像这样: g:/pattern/yank A g:/pattern/d 0put A [range]sort r /pattern2/ 这会像我需要的那样将我指定的所有行上移到文件顶部,但现在我需要根据模式对它们进行排序,如下所示: g:/pattern/yank A g:/pattern/d 0put A [range]s

作为我的一个项目的一部分,我试图将某些行从文件移到顶部,以某种方式排序。我不知道这些行出现后如何排序-我不想干扰文件中的其他行

我通过猛拉它们并将它们放下来移动它们,就像这样:

g:/pattern/yank A
g:/pattern/d
0put A
[range]sort r /pattern2/
这会像我需要的那样将我指定的所有行上移到文件顶部,但现在我需要根据模式对它们进行排序,如下所示:

g:/pattern/yank A
g:/pattern/d
0put A
[range]sort r /pattern2/
有没有办法在粘贴寄存器之前对其内容进行排序?还是只对与/pattern/匹配的行进行排序的方法?(因为所有被拉下的线当然都会被拉下)

我遇到了麻烦,希望能得到帮助


编辑-一种可能的解决方法可能是在拉伸线之前计算线的数量,然后在再次放置线后使用该方法对这些线进行选择和排序。我不知道如何计算这些行数-我可以用命令%s/pattern//n打印与模式匹配的行数,但我不能用这个数字做任何事情,也不能在函数中使用它。

整个
:g/pattern/cmd
的要点是在与
模式
匹配的每一行上执行
cmd
cmd
当然可以是
:sort

就像你做的那样:

:g/pattern/yank A
要将每一行匹配的
模式
追加到寄存器
a
,请执行以下操作:

:g/pattern/d
要剪切与
图案
匹配的每一行,可以执行以下操作:

:g/pattern/sort r /pattern2/
pattern2
上对每一行匹配的
pattern
进行排序

无论如何,你的例子是浪费的。您可以简单地执行以下操作,而不是使用三个命令滥用寄存器:

:g/pattern/m0
要将匹配的每一行
模式
移动到缓冲区顶部,然后使用以下命令对其进行排序:

:g//sort r /pattern2/

请参见
:help:global
:help:sort
:help:move
,我知道这已经很旧了,可能对您不再有用,但我今天刚刚解决了这个问题。它依赖于系统的
sort
命令(非vim)。假设您正在保存以注册:

qaq
:g/pattern/yank A
<C-O>
:put=system('sort --stable --key=2,3',@A)

我不知道janky是怎么想的,因为我对vim来说是个十足的傻瓜。我今天花了几个小时想弄明白这一点。它对我很有用,我也很满意,希望它也能帮助其他人。

:g/pattern/sort:这不是你认为的那样
:sort
的默认范围是整个缓冲区;
:全局
无效。如果改用
:.sort
,则会对单个行进行排序,因此不可操作。不幸的是,要使
:sort
正常工作,您确实需要一系列连续行。@Romaill感谢您的帮助,但我不确定这是否符合我的需要-如果我使用:g//sort r/pattern/则它会一次在一行上运行sort命令,实际上什么也不做。如果我使用:sort r/pattern/,它会对文档中的每一行进行排序,这是我必须避免的。我能想到的唯一办法是把我需要的行拉到寄存器中,把它们放回去,然后对它们进行排序。但问题是我不知道如何对寄存器的内容进行排序。一种可能的解决方法是计算要移动的行数,然后将它们放在顶部,然后对该范围进行排序。我不知道如何获得与模式匹配的行数:替换为n标记可以打印与模式匹配的行数,但我不能使用该值执行任何操作。