如何统计Vim中重复行的重复次数?

How to count the duplicate times of duplicate lines in Vim?

现在我正在使用 Gvim Windows。我想要一种不使用操作系统外部命令的纯Vim方式,来统计Vim中重复行的重复次数。 换句话说,我想要一种纯粹的 Vim 方式,如“:!sort % | uniq -c”。

没有现成的等效项。下面是一个快速而粗略的近似值。

正在做:

:echo getline(1,'$')->map({ idx, val -> getline(1,'$')->count(val) .. ' ' .. val })->sort()->uniq()->join("\n")

在此缓冲区上:

foo
foo
bar
baz

回应:

1 bar
1 baz
2 foo

在命令行中,这应该是一个很好的起点。

细分:

:echo {expr}

在命令行中回显 {expr} 的输出。

getline(1,'$')

returns 包含缓冲区中每一行的列表。

->map({ idx, val -> getline(1,'$')->count(val) .. ' ' .. val })

在列表中的每一项前面加上它在列表中的计数。

->sort()

对列表进行排序。

->uniq()

从列表中删除重复项。

->join("\n")

最后用换行符作为分隔符加入它,以便在回显到命令行时看起来不错。

虽然 romainl 的实现完全正确,但使用 dictionary 来计算出现次数可能具有更好的时间复杂度。

:let dict={}
:g/$/let ln=getline(".") | if !has_key(dict, ln) | let dict[ln]=0 | endif | let dict[ln]+=1
:for [k, v] in items(dict) | echo v." ".k | endfor