作为我的项目的一部分,我试图将某些行从文件移动到顶部,以某种方式排序。我不确定一旦那些线在那里怎么做排序 - 我不想打扰文件中的其他行。
我正在移动它们并将它们放回去,就像这样:
g:/pattern/yank A
g:/pattern/d
0put A
这会将我指定的所有行移动到文件的顶部,就像我需要的那样,但现在我需要根据模式对它们进行排序,如下所示:
[range]sort r /pattern2/
有没有办法在粘贴之前对寄存器的内容进行排序?或者只排序匹配/ pattern /的行的方法? (因为所有猛拉的线条当然都会。)
我受到了阻碍,我们将不胜感激。
编辑 - 一种可能的解决方法可能是在它们被拉出之前计算行数,然后使用它来选择并重新排列这些行。我不确定如何计算这些行 - 我可以使用命令打印与模式匹配的行数:%s / pattern // n但我不能对该数字执行任何操作,或者在函数中使用它
答案 0 :(得分:3)
:g/pattern/cmd
的重点是在匹配cmd
的每一行上执行pattern
。 cmd
当然可以是: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的完全菜鸟。我今天花了几个小时试图解决这个问题。它对我有用,我对此很满意,希望它也会对其他人有所帮助。