Como posso obter conclusão sensível ao contexto C / C ++ com a empresa?

11

Semantic parece capaz de fazer isso, mas não consigo fazê-lo funcionar como seria de esperar. Por exemplo, se eu #include "Type.h"declarar Type t, usar semantic-complete-analyze-inlinewhen point is after t.consistentemente me fornecerá o erro

Não é possível encontrar tipos para `Type t '

em vez de me dar todos os membros públicos (ou apropriados) de t.

Como posso obter o resultado que estou procurando aqui? Idealmente, como posso usar o que a Semantic pode fornecer como back-end para a Empresa?

Sean Allred
fonte
Você tem certeza de que Type.h existe, está sendo encontrado e declara o tipo Type? Se eu criar Type.he Type.cpp no ​​mesmo diretório que Type.h declarar uma classe Typecom campos int fooe char bar, semântica e empresa, funcionarão imediatamente .
J David Smith
Você verificou se a company-backendsvariável está company-semanticem sua lista? Se não, você vai querer adicionar preceder-lo para o primeiro da lista de modo que é pesquisado primeiro
cheezy
Curiosamente, ele funciona com o exemplo mínimo que eu descrevo. (Infelizmente, eu realmente não posso fornecer o caso de uso real, mas isso não deve importar.) Existe alguma maneira de forçar a Semântica a analisar tudo?
Sean Allred
@JDavidSmith Como posso garantir que ele está sendo encontrado? O projeto com o qual estou trabalhando é muito complexo em sua estrutura de construção.
Sean Allred
@cheezy company-semanticestá dentro company-backends; Obrigado :) #
22614 Sean Allred

Respostas:

1

Eu sugiro usar -mode ironia com empresa-ironia para conclusão em vez de semântico como semântica é geralmente muito lento e simplista - ie. geralmente não oferece conclusões quando você acha que deveria.

alexmurray
fonte
0

Você provavelmente deseja seguir o tutorial aqui e configurar company-clangpara obter melhores candidatos.

expez
fonte
0

Primeiro você precisa inicializar CEDET e 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")

então você pode usar os cabeçalhos da empresa ( 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
fonte