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

时间:2018-03-08 19:28:13

标签: vim

作为我的项目的一部分,我试图将某些行从文件移动到顶部,以某种方式排序。我不确定一旦那些线在那里怎么做排序 - 我不想打扰文件中的其他行。

我正在移动它们并将它们放回去,就像这样:

g:/pattern/yank A
g:/pattern/d
0put A

这会将我指定的所有行移动到文件的顶部,就像我需要的那样,但现在我需要根据模式对它们进行排序,如下所示:

[range]sort r /pattern2/

有没有办法在粘贴之前对寄存器的内容进行排序?或者只排序匹配/ pattern /的行的方法? (因为所有猛拉的线条当然都会。)

我受到了阻碍,我们将不胜感激。

编辑 - 一种可能的解决方法可能是在它们被拉出之前计算行数,然后使用它来选择并重新排列这些行。我不确定如何计算这些行 - 我可以使用命令打印与模式匹配的行数:%s / pattern // n但我不能对该数字执行任何操作,或者在函数中使用它

2 个答案:

答案 0 :(得分:3)

:g/pattern/cmd的重点是在匹配cmd的每一行上执行patterncmd当然可以是:sort

以同样的方式:

:g/pattern/yank A

将符合pattern的每一行附加到注册a

:g/pattern/d

要剪切与pattern匹配的每一行,您可以执行以下操作:

:g/pattern/sort r /pattern2/

pattern上与pattern2匹配的每一行进行排序。

无论如何,你的榜样很浪费。您可以简单地使用三个命令来滥用寄存器:

:g/pattern/m0

将每个匹配pattern的行移动到缓冲区的顶部,然后使用:

进行排序
:g//sort r /pattern2/

请参阅:help :global:help :sort:help :move

答案 1 :(得分:0)

我知道这已经很老了,可能对您没有任何用处,但是我今天才想通了。它依赖于系统的Sub HighlightDuplicateRows_2() 'This one is more modifiable and can handle multiple columns of data 'Just add another *WorksheetFunction.CountIf(Range("A2:A" & LastRow),Cells(r,1).Value) > 1* and change the column values Dim LastRow As Long LastRow = Cells(Rows.Count, "A").End(xlUp).Row For r = 2 To LastRow If WorksheetFunction.CountIf(Range("A2:A" & LastRow), Cells(r, 1).Value) > 1 And WorksheetFunction.CountIf(Range("B2:B" & LastRow), Cells(r, 2).Value) > 1 Then Rows(r).Interior.ColorIndex = 6 End If Next r End Sub 命令(而不是vim的命令)。假设您要保存注册A:

sort

qaq :g/pattern/yank A <C-O> :put=system('sort --stable --key=2,3',@A) :清除寄存器A中的任何内容

qaq:在当前缓冲区中搜索模式并将其复制到寄存器A

:g/pattern/yank A:在正常模式下按Ctrl + O会将您返回到光标所处的最后位置

<C-O>:将寄存器A的内容发送到排序命令的STDIN,并将输出粘贴到光标的当前位置。

我将整个内容映射到:put=system('sort --stable --key=2,3',@A)

<F8>

我不知道这是怎么变态的,因为我是vim的完全菜鸟。我今天花了几个小时试图解决这个问题。它对我有用,我对此很满意,希望它也会对其他人有所帮助。