Странная семантическая ошибка

Я переустановил emacs 24.2.50 на новом хосте Linux и запустил новую конфигурацию dotEmacs, основанную на конфигурации Magnars Emacs. Так как я использовал CEDET для некоторого успеха в моем предыдущем рабочем процессе, я начал настраивать его. Однако, когда я загружаю исходный файл C++, происходит странное поведение.

[Эта часть решена]
Как и ожидалось, семантический анализирует все включенные файлы (и во время начальной настройки анализирует все файлы, указанные переменными semantic-add-system-include), но выводит это сообщение об ошибке, которое выглядит следующим образом:

WARNING: semantic-find-file-noselect called for /usr/include/c++/4.7/vector while in set-auto-mode for /usr/include/c++/4.7/vector. You should call the responsible function into 'mode-local-init-hook'.

В приведенном выше примере ошибка печатается для вектора STL, но соответствующее сообщение об ошибке печатается для каждого файла, включенного в тот, который я посещаю, и для всех последующих. В результате это занимает довольно много времени, чтобы закончить, и, к сожалению, процесс повторяется, если я открываю новый буфер.

[Эта проблема тоже решена]
Кроме того, похоже, что синтаксический анализ на самом деле не работает, так как, когда я помещаю точку над примитивным типом, отличным от c (т.е. не int, double, float и т. Д.), Вместо вывода определения типа в строке состояния появляется сообщение об ошибке, подобное

Idle Service Error semantic-idle-local-symbol-highlight-idle-function: "#<buffer DEPFETResolutionAnalysis.cc> - Wrong type argument: stringp, (((0) \"IndexMap\"))" Idle Service Error semantic-idle-summary-idle-function: "#<buffer DEPFETResolutionAnalysis.cc> - Wrong type argument: stringp, ((\"fXBetween\" 0 nil nil))"

где DEPFETResolutionAnalysis.cc - это файл и буфер, который я сейчас редактирую, а IndexMap и fXBetween - это типы, определенные в файлах, включаемых в файл, который я редактирую / в некоторый файл, включаемый в файл, который я редактирую.

Я не проверял никаких дополнительных возможностей CEDET/ семантики, так как проблема довольно раздражающая. Мой конфиг cedet можно найти здесь.

РЕДАКТИРОВАТЬ: С помощью Алекса Отта я вроде как решил первую проблему. Это было из-за моей ужасной инициализации cedet. Смотрите его первый ответ о том, как правильно настроить CEDET!
Там все еще остается проблема с Idle Service Error (который при включении global-semantic-idle-local-symbol-highlight-mode, происходит постоянно, а не только при проверке определения типа в точке).
И есть новая проблема, как отключить файл инициализации сайта.

EDIT2: я выполнил semantic-debug-idle-function в буфере, где возникает проблема, и он выдает ~700kb [sic!] вывод. Похоже, что он выполняет некоторые операции над контейнером данных, который, судя по всему, содержит информацию обо всех символах, определенных в проанализированных файлах. Поскольку я проанализировал довольно большой пакет (~20 МБ исходных файлов), эта таблица довольно большая. Может ли семантика работать с такой большой базой данных или это невозможно и является причиной моей проблемы?

EDIT3: удаление содержимого ~/.semanticdb и перепрофилирование всех включений сделало свое дело. Мне все еще нужно отключить файлы инициализации по сайту, но поскольку это не связано с CEDET, я закрою этот вопрос (вопрос, связанный с файлами инициализации по сайту, можно найти здесь).

2 ответа

Решение

Первая проблема была решена путем правильной настройки CEDET, которая описана на домашней странице Алекса Отта. Его ответ решает эту первую проблему. Конфигурационный файл, указанный в его ответе, является отличным началом для хорошей конфигурации; Я использовал то же самое для настройки CEDET для своих нужд.

Вторая проблема исчезла, как только я обновил CEDET с версии 1.1 до версии базара (репозитория), что объясняется здесь и в статье Алекса. Дополнительно необходимо удалить содержимое каталога ~/.semanticdb (который содержит семантическую базу данных и, я думаю, был поврежден).

Я хотел бы поблагодарить Алекса Отта за его помощь и поддержку со мной на протяжении всего пути к решению:)

Вам нужно изменить файл инициализации, чтобы он выполнял загрузку CEDET только один раз, а не в той ловушке, которая будет вызываться для каждого файла.h/.hpp/.c/.cpp. Вы можете изменить этот конфиг в качестве базы и узнать больше в следующей статье.

Возникшая у вас проблема вызвана тем, что Semantic пытается проанализировать заголовочные файлы, и когда он пытается открыть их, его процедуры инициализации вызываются снова и снова...

Другие вопросы по тегам