如何在Vim标签文件中查找格式错误

8

最近我在Vim中使用自动补全宏(例如ctrl-n)时,遇到了以下错误:

E431: 标签文件“tags”中的格式错误

标签文件是使用Exuberant Ctags生成的,大约有1MB。我该如何找到触发此错误的错误?


6
在我的情况下,在“E431”错误消息的下方,还有另一条消息,指明错误发生在标签文件的哪个位置,例如“在63964633字节之前”。因此,解决问题就是打开Vim标签文件并输入“:go 63964633”以转到错误发生后的字节。这恰好是一个长为1404字节的行,删除此行即可解决问题。 - Susam Pal
9个回答

14

我发现生成的标签文件中在 !_TAG_FILE_FORMAT 行之前存在一些额外的行。当我删除这些额外行时,Vim 就开始正常工作了。


5
确实很奇怪,现在的问题是这些行是如何出现的。如果每次创建新的标签文件都必须删除它们,那么这就不是一个高效的工作流程了。你有没有找到导致这个问题的原因? - Thomas

6

函数名过长可能会导致此错误。您可以通过在vim中打开tags文件并查找超过50个字符的方法名来查找这些函数。

/^[^\t]{50,}

谢谢。我仍然想知道是否有处理它们的方法。另外,我猜你的50的值是任意的。这一切都很奇怪。 - mahemoff

6

我认为ctags在解析JavaScript文件方面存在问题。将其排除在标记之外可以解决这个问题。

ctags -R --exclude=*.js .

4
是一种面向行的数据库;在头部(以!_TAG_FILE_ ... 开始的行)之后,每一行都对应一个标记。
通过使用二分搜索,您应该能够快速定位有问题的行:保存tags文件的副本,删除其中一半并进行测试。如果仍然出现错误,请重复此步骤(直到只剩下一行)。否则,请取另一半并重复操作。
这是一种通用的故障排除技术;例如,它还可用于查找Vim插件中的问题(通过禁用一半插件)。

我用这个方法找到了它。对于其他人来说,tags 文件每次都会被读取,所以只需在保存文件后按一下 ctrl-p 或 ctrl-n 即可。最后,我去 tags 文件的顶部,删除了一半文件,并在 Vim 中尝试。我发现错误是由于开发过程中生成的 Rails 资源文件造成的,如果我视觉上检查了 tags 文件,我就能发现它,因为它是一个非常长的术语(255+个字符)。 - mahemoff
一个标签检查工具仍然很不错,但似乎没有。 - mahemoff

2

通过仅为Git文件生成标签来解决了问题。

git ls-files | ctags --links=no --languages=javascript,java,python -L- 

1
除了jaster的回答之外:
我找到了这个,它声明长于512个字符的行会破坏vim: 1. 保持文本简短,因为: - Vi可以处理的行长度限制为512个字符。 http://ctags.sourceforge.net/FORMAT 编辑:更新来源:https://neovim.io/doc/user/vi_diff.html 标签文件中行的最大长度:512字节。 我确实有一个超过512个字符的标签行-删除该行后,问题得以解决。

您的参考是1998年版本的Vi,而不是现代的ViM。 - MTCoster
1
你说得对!我已经添加了对neovim的引用,这是我最常使用的vim版本,并且是一个更为现代化的来源。 - Nick
在常规的 Vim 中仍然适用(https://vimhelp.org/vi_diff.txt.html 显示 Vim 8.1 也是如此) - mahemoff

0
我遇到了同样的问题,似乎并不是所有的文件格式都得到了很好的支持。我使用了选项-L来为仅C和C++文件创建标签,问题就解决了。 你可以尝试以下方法,只需将*.后缀替换为你需要的相应格式即可。
ctags -L $(find . -name *.c -or -name *.cpp -or -name *.h -or -name *.lua )

这会产生错误 ctags -L $(find . -name *.c -or -name *.cpp -or -name *.h -or -name *.lua ) -bash:/usr/bin/ctags:参数列表太长 - anand

0

我通过重建标签来解决了这个问题。

首先删除所有标签文件,然后从您的项目中重新构建标签。

我认为原因是我两次构建了标签文件,第一次是为子目录构建标签,然后再为父目录构建标签。

因此,子目录的标签可能无法包含一些父目录的信息。


-1

删除不符合ctags标准的额外行对我解决了这个问题。


2
这不是循环逻辑吗?也就是说,它实际上会导致同样的问题,即我如何知道哪些行是不符合要求的? - mahemoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接