¿Cómo puedo obtener la finalización contextual de C / C ++ con la empresa?

11

Semantic parece ser capaz de hacer esto, pero no puedo hacer que funcione como lo esperaría. Por ejemplo, si yo #include "Type.h"y declaro Type t, usar semantic-complete-analyze-inlinewhen point is after t.me da el error de manera consistente

No se pueden encontrar tipos para `Tipo t '

en lugar de darme todos los miembros públicos (o apropiados) de t.

¿Cómo puedo obtener el resultado que estoy buscando aquí? Idealmente, ¿cómo puedo usar lo que Semantic pueda proporcionar como back-end para la Compañía?

Sean Allred
fuente
¿Está seguro de que Type.h existe, se está encontrando y declara el tipo Type? Si hago Type.h y Type.cpp en el mismo directorio con Type.h declarando una clase Typecon campos int fooy char bar, la semántica y la empresa funcionan de inmediato .
J David Smith
¿Has verificado si la company-backendsvariable tiene company-semanticen su lista? Si no es así, querrás agregar el antecedente al primero de la lista para que se busque primero
descarado el
Curiosamente, funciona con el ejemplo mínimo que describo. (Desafortunadamente, realmente no puedo dar el caso de uso real, pero no debería importar). ¿Hay alguna forma de forzar a Semantic a analizar todo?
Sean Allred
@JDavidSmith ¿Cómo puedo asegurarme de que se encuentre? El proyecto con el que estoy trabajando es muy complejo en su estructura de construcción.
Sean Allred
@cheezy company-semanticestá adentro company-backends; gracias :)
Sean Allred

Respuestas:

1

Se sugiere emplear la ironía modo con la empresa-ironía para la terminación en lugar de semántica como semántica es generalmente demasiado lento y simplista - es decir. a menudo no ofrece terminaciones cuando crees que debería.

alexmurray
fuente
0

Probablemente desee seguir el tutorial aquí y configurarlo company-clangpara obtener mejores candidatos.

expez
fuente
0

Primero necesitas inicializar CEDET y 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")

entonces puede usar los encabezados c de la compañía ( 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
fuente