我试图在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能够做的事情,请告诉我,但我觉得这很有可能,而且只是我的工资等级。
答案 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