Я использую 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()
Кто-нибудь еще сталкивался с этим? Знаете, как это обойти?
EDIT: Вывод стека после включения debug-on-error
EDIT: Удален стек, так как теперь я знаю, как выглядят записи с ошибками например:
^L
c:\path\to\some\header.h,0
^L
c:\path\to\some\otherheader.h,0
Мой файл тегов содержит довольно много записей в этом формате. Глядя на задействованные заголовки, становится ясно, что etags не могут правильно их проанализировать. Это нормально, но я удивлен, что таблица-завершения-тегов
не учитывает этот формат в своем регулярном выражении. Для справки, вот как выглядит настоящая запись:
^L
c:\path\to\some\validheader.h,115
class CSomeClass ^?12,345
bool SomeMethod(^?CSomeClass::SomeMethod^A67,890