在emacs中生成标签完成表时堆栈溢出

pau*_*cam 7 tags emacs

我在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()
Run Code Online (Sandbox Code Playgroud)

有没有其他人遇到这个?知道一种解决方法吗?

编辑:打开后的堆栈输出debug-on-error

编辑:删除堆栈,因为我现在知道失败的条目是什么样的:

^L
c:\path\to\some\header.h,0
^L
c:\path\to\some\otherheader.h,0
Run Code Online (Sandbox Code Playgroud)

我的标签文件包含这种格式的相当多的条目.查看所涉及的标题,很明显etags无法正确解析它们.这很好,但我很惊讶,tags-completion-table它的正则表达式中没有考虑这种格式.作为参考,这是一个真正的条目:

^L
c:\path\to\some\validheader.h,115
class CSomeClass ^?12,345
bool SomeMethod(^?CSomeClass::SomeMethod^A67,890
Run Code Online (Sandbox Code Playgroud)

Lin*_*cer 3

所讨论的正则表达式用于匹配TAGS文件内的标记条目。我猜想,如果文件格式不正确(例如使用非本地行结尾),或者条目非常非常大,则可能会发生错误。(一个条目通常是一两行,这对于正则表达式匹配器来说不应该是问题。)

追踪问题的一种方法是在错误发生后转到 TAGS 缓冲区并查看点(光标)在哪里。一旦您知道它是什么函数,并且您可以在没有标签的情况下生活,您可以简单地避免为其生成 TAGS 条目。

如果问题是由于输入过于复杂,我建议您向 Emacs 团队发送错误报告。