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