vim,是否可以在文本中每次重复单词时在单词旁边添加递增的数字?

vim, is it possible to add increasing numbers next to words each time the words are repeated in a text?

假设我有一个包含以下内容的文本文件:

ABRADER                 AH B R EY D AH
ABRADER                 AH B R EY D AH R
ABRADERS                AH B R EY D AH Z
ABRADES                 AH B R EY D Z
APRIL                   EY P R AH L
APRIL                   EY P R AH 
APRIL                   EY AH P R AH 

我想执行一个 vim 命令来查找重复项并在每个重复的单词中添加一个计数器(在括号内),但它只检查每行中的第一个单词。在当前示例中,生成的文本应为:

ABRADER                 AH B R EY D AH
ABRADER(2)              AH B R EY D AH R
ABRADERS                AH B R EY D AH Z
ABRADES                 AH B R EY D Z
APRIL                   EY P R AH L
APRIL(2)                EY P R AH 
APRIL(3)                EY AH P R AH 

这转向了外部 awk 来完成这项工作。命令执行后格式可能乱七八糟(空格数)。但它会以所需格式为您提供出现次数。

%!awk 'a[]++{="("a[]")"}7'

对齐可以通过其他插件或者vim-fu来完成,如果你喜欢的话也可以用awk来完成,但是代码会比上面的长。

这是一个纯粹的 Vim 解决方案,以@Kent 的 awk 解决方案为蓝本(为了便于阅读,这里将一行分成多行):

let d = {} |
\   global/^\S/
\       let cw = expand('<cword>') |
\       let d[cw] = get(d, cw, 0) + 1 |
\       if d[cw] > 1 |
\           execute 'normal! elgR(' . d[cw] . ')' |
\       endif

它计算第一个单词的出现次数(<cword>:global将光标放在每个非空行的开头(^\S)),并使用gR 在不影响现有对齐方式的情况下追加计数。