Wie kann ich mit Company eine kontextsensitive C / C ++ - Vervollständigung erzielen?

11

Semantic scheint dazu in der Lage zu sein, aber ich kann es nicht so zum Laufen bringen, wie ich es erwarten würde. Wenn ich zum Beispiel #include "Type.h"deklariere und deklariere Type t, gibt mir die Verwendung von semantic-complete-analyze-inlinewhen point after t.konsistent den Fehler

Es können keine Typen für "Typ t" gefunden werden.

anstatt mir alle öffentlichen (oder anderweitig angemessenen) Mitglieder von zu geben t.

Wie kann ich hier das gewünschte Ergebnis erzielen? Wie kann ich im Idealfall die Semantik als Backend für das Unternehmen verwenden?

Sean Allred
quelle
Sind Sie sicher, dass Type.h existiert, gefunden wird und den Typ Type deklariert? Wenn ich Type.h und Type.cpp im selben Verzeichnis mache mit Type.h Deklaration eine Klasse Typemit Feldern int foound char barsemantische und Unternehmen zu arbeiten aus dem Kasten heraus .
J David Smith
Haben Sie überprüft, ob die company-backendsVariable company-semanticin der Liste enthalten ist? Wenn nicht, sollten Sie es dem ersten Teil der Liste voranstellen, damit es zuerst durchsucht wird
frecher
Interessanterweise funktioniert es mit dem minimalen Beispiel, das ich beschreibe. (Leider kann ich den tatsächlichen Anwendungsfall wirklich nicht angeben, aber es sollte keine Rolle spielen.) Kann ich Semantic auf irgendeine Weise zwingen, alles zu reparieren?
Sean Allred
@JDavidSmith Wie kann ich sicherstellen, dass es gefunden wird? Das Projekt, mit dem ich gerade arbeite, ist in seiner Build-Struktur sehr komplex.
Sean Allred
@cheezy company-semanticist in company-backends; danke :)
Sean Allred

Antworten:

1

Ich schlage vor, den Ironie-Modus mit Firmen-Ironie zur Vervollständigung anstelle der Semantik zu verwenden, da die Semantik im Allgemeinen zu langsam und zu simpel ist - dh. Es bietet oft keine Vervollständigungen, wenn Sie denken, dass es sollte.

alexmurray
quelle
0

Sie möchten wahrscheinlich dem Tutorial hier folgen und einrichtencompany-clang , um bessere Kandidaten zu erhalten.

expez
quelle
0

Zuerst müssen Sie CEDET und ede initialisieren

(global-ede-mode 1)
(add-to-list 'semantic-default-submodes 'global-semanticdb-minor-mode 1)
(add-to-list 'semantic-default-submodes 'global-semantic-idle-scheduler-mode 1)
(add-to-list 'semantic-default-submodes 'global-semantic-stickyfunc-mode 1)
(add-to-list 'semantic-default-submodes 'global-semantic-highlight-func-mode 1)
(add-to-list 'semantic-default-submodes 'global-semantic-idle-summary-mode t)
(add-to-list 'semantic-default-submodes 'global-semantic-idle-completions-mode t)
(add-to-list 'semantic-default-submodes 'global-srecode-minor-mode t)
(add-to-list 'semantic-default-submodes 'global-semantic-decoration-mode t)
(semantic-mode) ;; Active le mode semantic
(require 'stickyfunc-enhance) ;; multilines concatene dans la header line
(require 'cedet-cscope)

(require 'ecb)
(ede-cpp-root-project "projName"
                  :name "projName Project"
                  :file "~/workspaces/projName/proj.txt" ;; an arbitrary file
                  :include-path '("/src/main/src"
                                  "/src/main/include"
                                  "/src/test/src"
                                  "/src/test/include"
                                  ... )
                  :system-include-path '("/usr/include/ ~/workspaces/install/proj3/lib/ /usr/include/boost/")
                  :spp-table '(("isUnix" . "") ("BOOST_TEST_DYN_LINK" . "")))
;; cedet semantic
(semanticdb-enable-gnu-global-databases 'c-mode t)
(semanticdb-enable-gnu-global-databases 'c++-mode t)
;; You can add this to improve the parse of macro-heavy code:
(require 'semantic/bovine/c)
(add-to-list 'semantic-lex-c-preprocessor-symbol-file "/usr/lib/gcc/x86_64-redhat-linux/4.4.7/include/stddef.h")

Dann können Sie Company-C-Header verwenden ( https://github.com/randomphrase/company-c-headers ).

(require 'company-c-headers)
     (add-to-list 'company-backends 'company-c-headers)
     (add-to-list 'company-c-headers-path-system "/usr/include/c++/4.4.7/ /home/me/DEPEDENCIES/LIBXX/lib/ /home/me/DEPEDENCIES/LIBYY/lib /usr/include/boost/"))
djangoliv
quelle