Как я могу получить контекстное завершение C / C ++ с компанией?

11

Semantic кажется, в состоянии сделать это, но я не могу заставить его работать так, как я ожидаю. Например, если я #include "Type.h"и объявляю Type t, использование, semantic-complete-analyze-inlineкогда точка после t.последовательно выдает мне ошибку

Не удается найти типы для `Type t '

вместо того, чтобы дать мне все публичные (или иным образом соответствующие) члены t.

Как я могу получить результат, который я ищу здесь? В идеале, как я могу использовать то, что Semantic может предоставить в качестве бэкэнда для компании?

Шон Оллред
источник
Вы уверены, что Type.h существует, находится в поиске и объявляет тип Type? Если я создаю Type.h и Type.cpp в одном каталоге с Type.h, объявляя класс Typeс полями int fooи char bar, семантика и компания работают из коробки.
Джей Дэвид Смит
Вы проверили, company-backendsесть ли company-semanticв списке переменная ? Если нет, то вы захотите добавить его в первый список, чтобы его сначала искали
cheezy
Интересно, что это работает с минимальным примером, который я описываю. (К сожалению, я действительно не могу привести конкретный вариант использования, но это не должно иметь значения.) Могу ли я каким-то образом заставить Semantic снова проанализировать все?
Шон Оллред
@JDavidSmith Как я могу убедиться, что он найден? Проект, с которым я работаю, очень сложен по своей структуре сборки.
Шон Оллред
@cheezy company-semanticнаходится в company-backends; спасибо :)
Шон Оллред

Ответы:

1

Я предлагаю использовать режим иронии с компанией-иронией для завершения вместо семантики, поскольку семантика обычно слишком медленная и упрощенная - т.е. это часто не предлагает завершения, когда вы думаете, что это должно.

alexmurray
источник
0

Вы, вероятно, хотите следовать здесь и настроить учебник , company-clangчтобы получить более подходящих кандидатов.

expez
источник
0

Сначала вам нужно инициализировать CEDET и 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")

тогда вы можете использовать company-c-headers ( 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
источник