Universal Ctags警告Don't reuse the kind letter含义及解决方法
警告原因
该警告触发逻辑非常明确:通过--regex-<lang>参数自定义Swift语言的标签识别规则时,没有为每一类标签(变量、函数、类、结构体、协议)指定独立的单字符kind标识。Universal Ctags会为第一个定义的标签类型自动分配一个可用的单字符标识(本次场景下分配到的是r),后续所有未手动指定kind标识的规则,都会默认尝试复用这个已被占用的r,因此抛出「同语言下禁止重复使用kind字母」的警告。
两种执行命令的表现差异原因:
- 执行
ctags . -R时默认会扫描目录下所有支持的语言文件,Swift规则的kind冲突会导致整体标签写入流程异常中断,因此tags文件无法正常更新 - 执行
ctags --languages=swift -R .时仅扫描Swift文件,Ctags虽然会抛出警告,但不会被其他语言的扫描流程打断写入逻辑,因此tags可以正常生成
修复方案
直接修改~/.ctags.d/ctags.ctags里的自定义Swift规则,为每一类标签手动指定互不重复的单字符kind标识即可彻底消除警告,修正后的完整配置如下:
--langdef=Swift --langmap=Swift:+.swift --regex-swift=/(var|let)[ \t]+([^:=<]+).*$/\2/v,variable/ --regex-swift=/func[ \t]+([^\(\)<]+)\([^\(\)]*\)/\1/f,function/ --regex-swift=/class[ \t]+([^:\{<]+).*$/\1/c,class/ --regex-swift=/struct[ \t]+([^:\{<]+).*$/\1/s,struct/ --regex-swift=/protocol[ \t]+([^:\{<]+).*$/\1/p,protocol/
配置中各标签类型的标识分配:
- 变量(variable)指定kind标识为
v - 函数(function)指定kind标识为
f - 类(class)指定kind标识为
c - 结构体(struct)指定kind标识为
s - 协议(protocol)指定kind标识为
p
替换原有配置后,无论执行全语言扫描还是仅Swift扫描的ctags命令,都不会再出现该类警告,tags文件可正常生成更新。
内容的提问来源于stack exchange,提问作者abbood
相关产品推荐
相关产品推荐

