2012-11-04 20 views
10

Ponownie zainstalowałem emacs 24.2.50 na nowym hoście linuxowym i uruchomiłem nową konfigurację dotEmacs opartą na konfiguracji emacs magnars. Ponieważ użyłem CEDET do jakiegoś sukcesu w moim poprzednim przepływie pracy, zacząłem go konfigurować. Jednak istnieje pewne dziwne zachowanie za każdym razem, gdy ładuję plik źródłowy C++.Dziwny błąd semantyczny

[Ta część jest rozwiązany]
Zgodnie z oczekiwaniami, semantyczne Analizuje wszystkie zawarte pliki (a podczas wstępnej konfiguracji analizuje wszystkie pliki określone przez semantyczny-add-system-to zmienne), ale drukuje ten komunikat o błędzie, który wygląda tak:

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'.

W powyższym przykładzie błąd zostanie wydrukowany dla wektora STL, ale odpowiedni komunikat o błędzie zostanie wydrukowany dla każdego pliku zawartego przez jednego jestem wizyty i ewentualne późniejsze obejmuje. W rezultacie zakończenie procesu zajmuje dużo czasu i niestety proces powtarza się w każdym typie, w którym otwieram nowy bufor.

[Problem ten został rozwiązany Too]
Ponadto wygląda na to, parsowanie naprawdę nie działa jak kiedy umieścić punkt wyżej non-c prymitywnego typu (tzn nie int, double, float, etc) zamiast drukować definicję typu w modeline komunikat o błędzie podobny

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))"

gdzie DEPFETResolutionAnalysis.cc jest bufor plik & jestem obecnie Edycja i IndexMap i fXBetween to typy zdefiniowane w plikach zawartych w edytowanym pliku/pliku dołączonym do pliku, który edytuję.

Nie przetestowałem żadnych innych funkcji CEDET/semantic, ponieważ problem jest dość denerwujący. Moja konfiguracja cedetu można znaleźć here.

EDYCJA: Z pomocą Alexa Otta rozwiązałem pierwszy problem. Było to spowodowane moją straszliwą inicjacją cedetu. Zobacz pierwszą odpowiedź, aby poprawnie skonfigurować CEDET!
Nadal pozostaje problem z Idle Service Error (który po włączeniu global-semantic-idle-local-symbol-highlight-mode występuje na stałe, nie tylko podczas sprawdzania definicji typu w punkcie).
Istnieje również nowy problem z, jak wyłączyć plik (y) inicjujący pod kątem witryny.

EDIT2: Wykonałem semantic-debug-idle-function w buforze, w którym występuje problem, i generuje wynik ~ 700kb [sic!]. Wygląda na to, że wykonuje pewne operacje na kontenerze danych, który na podstawie jego wyglądu zawiera informacje o wszystkich symbolach zdefiniowanych w analizowanych plikach. Ponieważ przeanalizowałem dość duży pakiet (~ 20 MB plików źródłowych), ta tabela jest raczej duża. Czy semantyczna obsługa bazy danych, która jest duża, czy jest to niemożliwe i powodem mojego problemu?

EDIT3: Usunięcie zawartości ~/.semanticdb i ponowna analiza wszystkich załączeń sprawiły, że była to dobra sztuczka.Nadal potrzebuję wyłączyć pliki inicjujące na miejscu, ale ponieważ nie jest to związane z CEDET, zamknę to pytanie (pytanie dotyczące plików inicjujących witryny można znaleźć pod adresem here).

+1

Proszę podać informacje na jakiej wersji CEDET używasz itd Proszę również wziąć pod pamiętaj, że nie musisz wstawiać linii 2-40 w hak. Zadanie to (ładowanie CEDETa) powinno być wykonane tylko raz, a nie przy otwieraniu każdego pliku C/C++. Zobacz https://gist.github.com/3930120 jako przykład konfiguracji CEDETA –

+1

Są też inne błędy w twoim init - kiedy używasz 'c-mode-common-hook', to będzie on wywoływany dla C, C++ itd., Więc nie ma potrzeby ustawiania go osobno dla trybów C i C++. –

Odpowiedz

3

Pierwszy problem został rozwiązany przez prawidłowe skonfigurowanie CEDETa, które jest opisane na stronie Alex Ott: homepage. Jego odpowiedź rozwiązuje ten pierwszy problem. Plik konfiguracyjny określony w jego odpowiedzi jest świetnym początkiem dla ładnej konfiguracji; Użyłem tego samego, aby skonfigurować CEDET do moich potrzeb.

Drugi problem zniknął, gdy zaktualizowałem CEDET z wersji 1.1 do wersji bazaru (repozytorium), co wyjaśniono w artykule here oraz w artykule Alexa. Dodatkowo należy usunąć zawartość katalogu ~/.semanticdb (która zawiera semantyczną bazę danych i była zepsuta, jak sądzę).

Chciałbym podziękować Alex Ott za jego pomoc i trzyma się mnie w całej mojej podróży do rozwiązania :)

6

Musisz zmienić swój plik init, aby załadował CEDET tylko raz, a nie w hak, który będzie wywoływany dla każdego pliku .h/.hpp/.c/.cpp. Możesz zmienić this config jako bazę i przeczytać więcej w following article.

Problem, który masz jest spowodowane tym, że semantyczna próbuje analizować pliki nagłówkowe, a gdy próbuje je otworzyć, a następnie jej procedury inicjalizacji nazywane są znowu, i znowu ...

+0

Nie ma pliku o nazwie "cedet-devel-load.el" w archiwum cedet pobranym ze strony głównej cedetu. Podczas ładowania pliku common/cedet.el (zgodnie z prostym przewodnikiem konfiguracji ze strony głównej cedetu) błąd ten występuje podczas ładowania: 'error: EIEIO Version 1.3 already loaded; wczytaj CEDET na początku pliku init, aby tego uniknąć. " Zidentyfikowaliśmy, że plik eieio.elc istnieje w /usr/share/emacs/24.2.50/lisp/emacs-lisp/, który jest wymagany przez ** auth-source.elc ** (który jest częścią gnus). – elemakil

+0

To jest dość dziwne, ponieważ nie użyłem gnusa na tym komputerze i dlatego nie jest skonfigurowane ... także, nie rozumiem, dlaczego źródło gnus/auth wymagałoby eieio, które (o ile rozumiem) jest używane do Diagramy UML i podobne rzeczy. – elemakil

+0

jeśli korzystasz z zewnętrznego CEDETU, musisz go najpierw załadować, zanim zostanie wbudowany. Lepiej jest też zrobić migawkę bzr i skonfigurować ją tak, jak to opisano w artykule –

Powiązane problemy