Vim函数按标签按行排序

时间:2018-03-08 17:56:37

标签: vim

我试图在gVim中创建一个自定义函数来根据标记对行进行排序,而且我有点超出了我的深度。我的目标是在我的_gvimrc中创建一个自定义函数,这样我就可以在必要时快速采用这种方式。我需要一些关于在哪里学习的指示。

我的目标是按行开头的标记对行进行分组

:a
some text
more text
:b
some other text
more other text
:c
final text

file contents 1
file contents 2

将成为

:a text
:a text
:a text

挑战很大程度上是因为我不想弄乱文件中的其他行 - 那些没有标签的行。 :sort函数将重新排序所有这些。

我有一种感觉,我需要: 1.将带有标签的所有行拖入寄存器,并删除它们(某种:g / pattern / yank寄存器?) 2.把它们全部放在文件的开头(某种:g / pattern / put寄存器?) 3.通过标签对块进行排序(某种类型:sort r / pattern /?) 4.迭代每个标记以重新格式化

:a
text
text
text

{{1}}

我对gVim的熟练程度不足以知道从哪里开始 - 如果这里的任何人都足够专家来帮助解决其中一个子问题,可以这么说,或者对方法有更好的了解,我和#39;我真的很感激。我在第4位特别受阻。

如果这不是gVim能够做的事情,请告诉我,但我觉得这很有可能,而且只是我的工资等级。

1 个答案:

答案 0 :(得分:0)

我认为awk或更高级的语言更适合这种情况。使用awk和Vim过滤器的示例%!

:%!awk '$1 ~ /^:/ { a[$1] = a[$1] substr($0, 3) "\n"; next} {r = r $0 "\n"} END { asorti(a, keys); for (k in keys) { print keys[k]; print a[keys[k]] } print ""; print r}'

更漂亮的版本:

$1 ~ /^:/ {
    a[$1] = a[$1] substr($0, 3) "\n";
    next
}

{
    r = r $0 "\n"
}

END {
    asorti(a, keys);
    for (k in keys) {
        print keys[k];
        print a[keys[k]]
    }
    print "";
    print r
}

注意:我使用gawk