出现意外行为的原因很可能是:
- 您使用的不是Exuberant Ctags当前最新的 5.8 版本,而是 5.6 之前的版本。
- 您的
.ctags
文件--langmap=html:+.volt
在文件末尾没有行终止。
阅读下面的完整故事,了解为什么我认为这两个原因会导致Ctags在您的计算机上出现意外行为。
我首先使用带有文本编辑器UltraEdit的旧版本 5.5.4 Exuberant Ctags以及后来直接从Exuberant Ctags项目页面下载的版本 5.8 在 Windows 上查看了您的问题。
我创建了我的一个 HTML 项目的副本,其中只有 1 个 *.html 文件在测试项目的父目录中,3 个 *.html 文件在子目录中,另外两个 *.html 文件也在子目录中,文件扩展名从更改html
为volt
这两个文件只是此子目录中 3 个 *.html 文件中的 2 个的副本。
接下来,我在项目的父目录中创建了一个ctags.conf
文件,并将您发布的几行复制到该文件中。此外,我在顶部插入了一行,--verbose
因为这对于查找此类问题很有用。
最后我将ctags.exe
(首先是 v5.5.4,后来是 v5.8)也复制到了测试项目目录中,只是为了更容易从命令行运行它。
我在测试项目目录中打开了一个命令提示符窗口并执行
ctags.exe -f test.tag --options=ctags.conf
我可以在详细输出中看到两个 *.volt 文件都已打开以进行处理并创建test.tag
还包含来自 2 个 *.volt 文件的所有标签,这些标签与复制 *.volt 文件的 2 个 *.html 文件的标签相同前。
那么可能是什么问题呢?
我不仅熟悉 HTML。我的主要工作是用 C/C++ 编程。因此,我知道 C 源代码文件在读取文本文件时经常犯的错误:对文本文件的错误处理,文件最后一行没有行终止。
而且我知道,gedit
即使文件的最后一行没有行终止,Linux 上的一些文本编辑器也会将插入符号放在文件最后一行下方的行开头的 Ctrl+End 上。在这种情况下,插入符号应该由文本编辑器定位在最后一行的字符串末尾,而不是从文件实际末尾之外的下一行开始。在我看来,这种错误行为让文本编辑器的用户认为文本文件在文件的最后一行也有行终止,即使这不是真的。
所以我认为您--langmap=html:+.volt
可能在文件末尾附加了没有行终止的内容,并且ctags.exe
在这种情况下没有评估该行,因为源代码中的文本文件解析做得不好。因此,我从最后一行中删除了行终止,ctags.conf
现在仅包含--langmap=html:+.volt
我执行了与以前相同的命令行和AHA,两个 *.volt 文件都被忽略了,因为unknown language
.
这是我下载Ctags for Windows 5.8 版并将其复制到测试项目目录中替换 5.5.4 版可执行文件的时间。
我再次执行了未修改的命令行ctags.conf
。两个 *.volt 文件都由Ctags处理并test.tag
再次包含来自两个 *.volt 文件的标签。
再次在文件的最后一行附加ctags.conf
一个行终止并再次执行命令行并没有导致不同的输出。因此,如果文件末尾没有行终止,则忽略选项文件的最后一行的这个错误在Ctags的 5.8 版中得到修复。
我在Exuberant Ctags的更改说明中搜索并在ctags-5.6的更改说明块中找到(2006 年 5 月 29 日星期一)last
- 修复了在没有最终换行符的情况下读取列表文件 (-L) 的最后一行的问题。
这是对我所想和所见的确认。当然,问题不仅存在于读取列表文件,还存在于读取其他文本文件,如选项文件或 C 和 Java 文件,因为更改说明中的下一行通知
- 修复了在没有最终换行符 [C, Java] 的文件上可能发生的无限循环。