我在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)