2012-11-04 16 views
10

Ich habe Emacs 24.2.50 auf eine neue Linux-Host neu installiert und gestartet Konfiguration eine neue dotEmacs Config basierend auf magnars Emacs. Da ich CEDET in meinem vorherigen Workflow erfolgreich eingesetzt habe, habe ich mit der Konfiguration begonnen. Es gibt jedoch ein seltsames Verhalten, wenn ich eine C++ - Quelldatei lade.Seltsam semantischer Fehler

[Dieser Teil gelöst]
Wie erwartet, alle semantische Parsen enthaltenen Dateien (und bei der Ersteinrichtung parsen alle vom angegebenen Dateien semantisch-Add-System-umfassen Variablen), aber er druckt diese eine Fehlermeldung, die wie folgt lautet:

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

im obigen Beispiel wird der Fehler für die STL-Vektor gedruckt, sondern eine entsprechende Fehlermeldung für jede Datei durch einen eingeschlossen gedruckt ich besuche und alle späteren beinhaltet. Als Folge dauert es ziemlich lange, bis der Vorgang abgeschlossen ist. Leider wird der Vorgang wiederholt. Ich öffne einen neuen Puffer.

[Dieses Problem ist gelöst Too]
Außerdem sieht es aus wie das Parsen nicht wirklich arbeiten, wie wenn ich den Punkt über einem nicht-c Urtyp platzieren (dh nicht int, double, float, etc.) statt der Definition des Typs Druck in der mode~~POS=TRUNC eine Fehlermeldung wie

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

wo DEPFETResolutionAnalysis.cc die Datei & Puffer ich zur Zeit der Bearbeitung und IndexMap und fXBetween sind Typen in Dateien, die von der Datei enthalten definiert Ich bin der Bearbeitung/einiger Datei durch die Datei enthalten I Bearbeitung bin.

Ich habe keine weiteren Funktionen von cedet getestet/semantischen wie das Problem ziemlich ärgerlich. Meine cedet Konfiguration kann here gefunden werden.

EDIT: Mit Hilfe von Alex Ott habe ich das erste Problem irgendwie gelöst. Es war wegen meiner schrecklichen cedet Initialisierung. Sehen Sie seine erste Antwort für die richtige Konfiguration von CEDET!
Es bleibt immer noch das Problem mit dem Idle Service Error (die, wenn sie global-semantic-idle-local-symbol-highlight-mode ermöglicht, dauerhaft, nicht nur dann auftritt, wenn die Definition des Typs an Punkt-Kontrolle).
Und es gibt die neue Problem, wie zu deaktivieren Sie die Site-weise Init-Datei (en).

EDIT2: Ich habe semantic-debug-idle-function in einem Puffer ausgeführt, in dem das Problem auftritt und es produziert ~ 700kb [sic!] Ausgabe. Es sieht so aus, als würde es einige Operationen an einem Datencontainer ausführen, der, wie es aussieht, Informationen über alle Symbole enthält, die in den analysierten Dateien definiert sind. Da ich ein ziemlich großes Paket (~ 20Mb Quelldateien) geparst habe, ist diese Tabelle ziemlich groß. Kann Semantik eine Datenbank so groß handhaben oder ist das unmöglich und der Grund meines Problems?

EDIT3: Löschen des Inhalts von ~/.semanticdb und Reparieren alle umfasst den Trick.Ich muss immer noch die siteweisen Init-Dateien deaktivieren, aber da dies nicht mit CEDET zu tun hat, werde ich diese Frage schließen (die Frage bezüglich der siteweisen Init-Dateien kann here gefunden werden).

+1

Bitte geben Sie Informationen darüber, welche Version von cedet Sie verwenden, etc. Bitte auch tragen Konto, dass Sie die Zeilen 2-40 nicht in den Haken legen müssen. Diese Aufgabe (Laden von CEDET) sollte nur einmal ausgeführt werden, nicht beim Öffnen jeder C/C++ Datei. Siehe https://gist.github.com/3930120 als Beispiel für die CEDET-Konfiguration –

+1

Es gibt auch andere Fehler in Ihrem init - wenn Sie 'c-mode-common-hook' verwenden, dann wird es für C aufgerufen, C++ usw., so dass es nicht notwendig ist, es für C & C++ - Modi separat einzustellen. –

Antwort

3

Das erste Problem wurde gelöst durch korrektes Konfigurieren von CEDET, das auf Alex Ott's homepage beschrieben ist. Seine Antwort löst dieses erste Problem. Die Konfigurationsdatei in seiner Antwort ist ein guter Start für eine nette Konfiguration; Ich habe das selbe benutzt, um CEDET für meine Bedürfnisse zu konfigurieren.

Das zweite Problem verschwand, nachdem ich CEDET von 1.1 auf die Basar (Repository) Version aktualisiert, die here und in Alex 'Artikel erklärt wird. Außerdem muss man den Inhalt des Verzeichnisses ~/.semanticdb löschen (welches die semantische Datenbank enthält und vermutlich beschädigt wurde).

Ich möchte Alex Ott für seine Hilfe danken und zu der Lösung mit mir während meiner Reise kleben :)

6

Sie müssen Ihre Init-Datei so ändern, dass das Laden von CEDET nur einmal ausgeführt wird, nicht in dem Hook, der für jede .h/.hpp/.c/.cpp-Datei aufgerufen wird. Sie können this config als Basis ändern, und lesen Sie mehr in following article.

Das Problem, das Sie haben, ist dadurch verursacht, dass Semantic versucht, Header-Dateien zu analysieren, und wenn er versucht, sie zu öffnen, dann werden seine Initialisierungsroutinen erneut aufgerufen, und wieder ...

+0

Es gibt keine Datei mit dem Namen 'cedet-devel-load.el' im Cedet-Archiv, das von der Cedet-Homepage heruntergeladen wurde. Beim Laden von common/cedet.el (gemäß der einfachen Setup-Anleitung von der Cedet-Homepage) tritt dieser Fehler beim Laden auf: 'error: EIEIO Version 1.3 ist bereits geladen; Laden Sie CEDET am Anfang Ihrer Init-Datei, um dies zu vermeiden. Ich habe festgestellt, dass eine eieio.elc unter /usr/share/emacs/24.2.50/lisp/emacs-lisp/ existiert, die von ** auth-source.elc ** benötigt wird (was ein Teil von gnus ist). – elemakil

+0

Das ist ziemlich seltsam, da ich Gnus auf dieser Maschine nicht benutzt habe und folglich nicht konfiguriert ist ... auch, ich verstehe nicht, warum gnus/auth-source eieio benötigen würde, was (soweit ich es verstehe) verwendet wird UML-Diagramme und ähnliches. – elemakil

+0

Wenn Sie externes CEDET verwenden, müssen Sie es zuerst laden, bevor es integriert wird. Es ist auch besser, einen neuen bzr-Snapshot zu nehmen und ihn zu konfigurieren, wie in Artikel –