Я переустановил emacs 24.2.50 на новом хосте linux и запустил новую конфигурацию dotEmacs на основе magnars Конфигурация Emacs. Так как я использовал CEDET для некоторого успеха в моем предыдущем рабочем процессе, я начал настраивать его. Однако, когда я загружаю исходный файл C ++, происходит странное поведение.
[Эта часть решена]
Как и ожидалось, семантический анализ всех включенных файлов (и во время начальной настройки анализирует все файлы, указанные семантико-надстройка система включает в себя переменные), но выводит сообщение об ошибке, которое выглядит следующим образом:
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, я закрою этот вопрос (вопрос, связанный с файлами инициализации по сайту, можно найти Вот).
Вам нужно изменить файл инициализации, чтобы он выполнял загрузку CEDET только один раз, а не в той ловушке, которая будет вызываться для каждого файла .h / .hpp / .c / .cpp. Ты можешь измениться этот конфиг в качестве базы, и читать больше в следующая статья.
Проблема, которая у вас возникла, вызвана тем, что Semantic пытается проанализировать заголовочные файлы, и когда он пытается открыть их, его процедуры инициализации вызываются снова и снова …
Первая проблема была решена путем правильной настройки CEDET, которая описана на Алексе Отте домашняя страница. Его ответ решает эту первую проблему. Конфигурационный файл, указанный в его ответе, является отличным началом для хорошей конфигурации; Я использовал то же самое для настройки CEDET для своих нужд.
Вторая проблема исчезла, как только я обновил CEDET с версии 1.1 до версии базара (репозитория), что объясняется Вот и в статье Алекса. Дополнительно необходимо удалить содержимое каталога ~/.semanticdb
(который содержит семантическую базу данных и, я думаю, был поврежден).
Я хотел бы поблагодарить Алекса Отта за его помощь и поддержку со мной на протяжении всего моего пути к решению 🙂