Я использую GNU Emacs 23.3 в Windows. Я работаю в очень большой кодовой базе, для которой генерирую файл TAGS (используя бинарный файл etags, поставляемый с Emacs). Файл TAGS довольно большой (обычно занимает около 100 МБ). Мне редко нужно использовать какую-либо функциональность, кроме 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