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

vim,每次在文本中重复单词时,是否可以在单词旁边增加数字?,vim,Vim,假设我有一个包含以下内容的文本文件: 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 A

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

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[$1]++{$1=$1"("a[$1]")"}7'

对齐可以由其他插件或vim fu完成,如果您愿意,也可以由awk完成,但代码会比上面的长。

这里是一个纯vim解决方案,模仿@Kent的
awk
解决方案(为了可读性,这里将一行代码拆分为多行):

设d={}|
\全局/^\S/
\设cw=展开(“”)|
\设d[cw]=get(d,cw,0)+1|
\如果d[cw]>1|
\执行'正常!elgR('.d[cw].')'|
\恩迪夫

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

如果这行有帮助?请注意,输出格式已更改<代码>%!awk'a[$1]+{$1=$1”(“a[$1]”)7'但是你可以将它们与其他插件重新对齐。感谢Kent,这行代码似乎工作得很好(正如你所说的格式的一部分),7'是什么意思?awk将非零数字作为默认操作:
{print}
因此
7
将打印这行代码。如果它解决了你的问题,我会把它作为一个答案发布。这似乎也很完美,格式很完美,但括号内的数字与单词之间用一个空格隔开,我如何将括号上的数字附加到相应的单词上?(vim super初学者)这是在
ell
运动中编码的:第一个单词的末尾,右边两个。我已将其更改为
el
,以符合您的要求。现在它看起来工作得很好,谢谢Ingo
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