最近我在Vim中使用自动补全宏(例如ctrl-n)时,遇到了以下错误:
E431: 标签文件“tags”中的格式错误
标签文件是使用Exuberant Ctags生成的,大约有1MB。我该如何找到触发此错误的错误?
我发现生成的标签文件中在 !_TAG_FILE_FORMAT 行之前存在一些额外的行。当我删除这些额外行时,Vim 就开始正常工作了。
函数名过长可能会导致此错误。您可以通过在vim中打开tags文件并查找超过50个字符的方法名来查找这些函数。
/^[^\t]{50,}
我认为ctags在解析JavaScript文件方面存在问题。将其排除在标记之外可以解决这个问题。
ctags -R --exclude=*.js .
!_TAG_FILE_ ... 开始的行)之后,每一行都对应一个标记。
通过使用二分搜索,您应该能够快速定位有问题的行:保存tags文件的副本,删除其中一半并进行测试。如果仍然出现错误,请重复此步骤(直到只剩下一行)。否则,请取另一半并重复操作。
这是一种通用的故障排除技术;例如,它还可用于查找Vim插件中的问题(通过禁用一半插件)。
通过仅为Git文件生成标签来解决了问题。
git ls-files | ctags --links=no --languages=javascript,java,python -L-
1. 保持文本简短,因为:
- Vi可以处理的行长度限制为512个字符。
http://ctags.sourceforge.net/FORMAT
编辑:更新来源:https://neovim.io/doc/user/vi_diff.html
标签文件中行的最大长度:512字节。
我确实有一个超过512个字符的标签行-删除该行后,问题得以解决。ctags -L $(find . -name *.c -or -name *.cpp -or -name *.h -or -name *.lua )
我通过重建标签来解决了这个问题。
首先删除所有标签文件,然后从您的项目中重新构建标签。
我认为原因是我两次构建了标签文件,第一次是为子目录构建标签,然后再为父目录构建标签。
因此,子目录的标签可能无法包含一些父目录的信息。
删除不符合ctags标准的额外行对我解决了这个问题。