【发布时间】:2011-03-27 18:35:46
【问题描述】:
我在 Windows 上使用 GNU Emacs 23.3。我在一个非常大的代码库中工作,为此我生成一个 TAGS 文件(使用 Emacs 提供的 etags 二进制文件)。 TAGS 文件非常大(通常徘徊在 100MB 左右)。我很少需要使用find-tag 之外的任何功能,但有时我希望我可以在 TAGS 表之外完成。
调用complete-tag 会导致 Emacs 自动生成一个完成表。这个过程需要相当长的时间,但我的问题不在于它所花费的时间,而是在最后(大约 100% 完成),我得到一个堆栈溢出(抱歉无法打印的字符):
Debugger entered--Lisp error: (error "Stack overflow in regexp matcher")
re-search-forward("^\\(\\([^]+[^-a-zA-Z0-9_+*$:]+\\)?\\([-a-zA-Z0-9_+*$?:]+\\)[^-a-zA-Z0-9_+*$?:]*\\)\\(\\([^\n]+\\)\\)?\\([0-9]+\\)?,\\([0-9]+\\)?\n" nil t)
etags-tags-completion-table()
byte-code(...)
tags-completion-table()
还有其他人遇到过这种情况吗?知道解决方法吗?
编辑:开启debug-on-error后的堆栈输出
编辑:删除堆栈,因为我现在知道失败的条目是什么样的:
^L
c:\path\to\some\header.h,0
^L
c:\path\to\some\otherheader.h,0
我的标签文件包含很多这种格式的条目。查看所涉及的标头,很明显它们无法被 etags 正确解析。这很好,但我很惊讶tags-completion-table 没有在其正则表达式中考虑这种格式。作为参考,下面是真实条目的样子:
^L
c:\path\to\some\validheader.h,115
class CSomeClass ^?12,345
bool SomeMethod(^?CSomeClass::SomeMethod^A67,890
【问题讨论】:
-
我现在知道如何在事后修复我的 TAGS 文件,以便标签完成生成成功。随时发布有关如何防止首先生成虚假条目的建议...
-
我使用 matlab 文件,因此我将 etags 与一堆自定义正则表达式一起使用,但我发现当我要求 etags 解析脚本时,TAGS 表中出现“错误条目”它没有找到任何有趣的标签。它会创建您指定的这种“空”条目,它只返回
path,0。不知道如何抑制这种行为。幸运的是,这些似乎总是在 TAGS 文件的底部,所以为它写一个清理器应该很容易。