Comment puis-je obtenir une complétion contextuelle C / C ++ avec la société?

11

Semantic semble être en mesure de le faire, mais je ne peux pas le faire fonctionner comme je m'y attendais. Par exemple, si je #include "Type.h"et déclare Type t, utiliser semantic-complete-analyze-inlinequand le point est après t.me donne systématiquement l'erreur

Impossible de trouver les types pour «Type t»

au lieu de me donner tous les membres publics (ou autrement appropriés) de t.

Comment puis-je obtenir le résultat que je recherche ici? Idéalement, comment puis-je utiliser tout ce que Semantic pourrait fournir comme backend pour la société?

Sean Allred
la source
Êtes-vous sûr que Type.h existe, est trouvé et déclare le type Type? Si je fais Type.h et Type.cpp dans le même répertoire avec Type.h déclarant une classe Typeavec des champs int fooet char bar, sémantique et entreprise fonctionnent hors de la boîte.
J David Smith
Avez-vous vérifié si la company-backendsvariable a company-semanticdans sa liste? Sinon, vous voudrez l'ajouter au début de la liste pour qu'il soit recherché en premier
cheezy
Fait intéressant, cela fonctionne avec l'exemple minimal que je décris. (Malheureusement, je ne peux vraiment pas donner le cas d'utilisation réel, mais cela ne devrait pas avoir d'importance.) Existe-t-il un moyen de forcer Semantic à tout analyser?
Sean Allred
@JDavidSmith Comment puis-je m'assurer qu'il est trouvé? Le projet avec lequel je travaille est très complexe dans sa structure de construction.
Sean Allred
@cheezy company-semanticest dedans company-backends; merci :)
Sean Allred

Réponses:

1

Je suggère d'utiliser le mode ironie avec l' ironie de l' entreprise pour l'achèvement au lieu de la sémantique car la sémantique est généralement trop lente et simpliste - c'est-à-dire. Souvent, il n'offre pas de finitions quand vous le pensez.

alexmurray
la source
0

Vous voudrez probablement suivre le tutoriel ici et configurer company-clangpour obtenir de meilleurs candidats.

expez
la source
0

Vous devez d'abord initialiser CEDET et ede

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

alors vous pouvez utiliser les en-têtes de l'entreprise ( 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
la source