Странная смысловая ошибка

Я переустановил 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 — это типы, определенные в файлах, включенных в этот файл. m редактирование/некоторый файл, включенный в файл, который я редактирую.

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

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

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

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


person elemakil    schedule 04.11.2012    source источник
comment
Пожалуйста, предоставьте информацию о том, какую версию CEDET вы используете и т. д. Пожалуйста, обратите также внимание, что вам не нужно ставить строки 2-40 в хук. Эту задачу (загрузку CEDET) следует выполнять только один раз, а не при открытии каждого файла C/C++. См. gist.github.com/3930120 в качестве примера конфигурации CEDET.   -  person Alex Ott    schedule 04.11.2012
comment
В вашем init есть и другие ошибки - когда вы используете c-mode-common-hook, то он будет вызываться для C, C++ и т. д., поэтому нет необходимости устанавливать его отдельно для режимов C и C++.   -  person Alex Ott    schedule 04.11.2012


Ответы (2)


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

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

person Alex Ott    schedule 04.11.2012
comment
В архиве cedet, загруженном с домашней страницы cedet, нет файла с именем «cedet-devel-load.el». При загрузке common/cedet.el (согласно простому руководству по настройке с домашней страницы cedet) возникает эта ошибка при загрузке: error: EIEIO Version 1.3 already loaded; load CEDET at the beginning of your init file to avoid this.. Я определил, что в /usr/share/emacs/24.2.50/lisp/emacs-lisp/ существует файл eieio.elc, который требуется для auth-source.elc (который является частью gnus) . - person elemakil; 05.11.2012
comment
Это довольно странно, так как я не использовал gnus на этой машине и, следовательно, он не настроен... также я не понимаю, почему gnus/auth-source требует eieio, который (насколько я понимаю) используется для UML схемы и тому подобное. - person elemakil; 05.11.2012
comment
если вы используете внешний CEDET, то вам нужно сначала загрузить его, а затем встроенный. Также лучше взять свежий снимок bzr и настроить его, как описано в статье - person Alex Ott; 05.11.2012
comment
Проблема все еще остается в том, что eieio загружается какой-то другой библиотекой (я думаю, gnus/auth-source). Есть ли способ узнать, какой файл запуска сайта загружает библиотеку? - person elemakil; 05.11.2012
comment
gnus/auth-source должен автоматически загружаться при первом использовании. у вас есть сайт-сайт-инициализация? Попробуйте запустить Emacs с -q, чтобы увидеть, произойдет эта ошибка или нет. Я использую Debian + emacs-snapshot и у меня нет проблем с загрузкой CEDET перед всем. - person Alex Ott; 05.11.2012
comment
Я сам не настроил инициализацию сайта. Я использую Xubuntu 12.10 с emacs-snapshot (из этого репозитория: launchpad.net/~cassou/ +архив/emacs ). При выполнении emacs-snapshot-gtk -q ошибка не возникает, но и CEDET не загружается. Когда я загружаю cedet.el с помощью load-file, повторяется та же ошибка. При просмотре переменной load-history eieio требуется еще раз для источника авторизации перед загрузкой CEDET. - person elemakil; 05.11.2012
comment
Хорошо... выполнение emacs-snapshot-gtk --no-site-file действительно позволяет загрузить CEDET без ошибок (сейчас используется версия bzr). Анализ выполняется только один раз, и первый из двух типов ошибок, описанных выше, исчезает. Но все еще остается вторая ошибка и проблема в том, что я не знаю, как навсегда отключить файл инициализации сайта... Спасибо за вашу помощь, Алекс! - person elemakil; 05.11.2012

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

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

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

person elemakil    schedule 05.11.2012