Подтвердить что ты не робот

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

Я переустановил emacs 24.2.50 на новом хосте linux и начал новую конфигурацию dotEmacs на основе magnars конфигурации emacs. Поскольку я использовал CEDET для некоторых успехов в моем предыдущем рабочем процессе, я начал настраивать его. Однако при загрузке исходного файла на С++ существует какое-то странное поведение.

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

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, но соответствующее сообщение об ошибке печатается для каждого файла, включенного в тот, который я посещаю, и последующего включения. В результате требуется довольно много времени, и, к сожалению, процесс повторяется любым типом, я открываю новый буфер.

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

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/semantic, так как проблема довольно раздражает. Моя конфигурация cedet находится здесь здесь.

EDIT: С помощью Alex Ott я решил первую проблему. Это было из-за моей ужасной инициализации седе. Посмотрите его первый ответ на правильный способ настройки CEDET!
Все еще остается проблема с Idle Service Error (которая при включении global-semantic-idle-local-symbol-highlight-mode возникает постоянно, причем не только при проверке определения типа в точке).
И есть новая проблема, как отключить файл инициализации сайта.

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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