I use emacs 28/29 on windows. this is my config.
(use-package company :ensure t :pin gnu :init (global-company-mode) :config (setq company-backends '(company-dabbrev) company-idle-delay 0 company-echo-delay 0))
(use-package eglot :ensure t :commands (eglot eglot-ensure eglot-server-programs) :hook ((c-mode . eglot-ensure) (c++-mode . eglot-ensure)) :config (add-hook 'eglot-mode-hook (lambda () (setq-local company-backends '(company-dabbrev ;; company-capf )))) (add-to-list 'eglot-server-programs '((c++-mode c-mode) "D:/LLVM/bin/clangd.exe")) (add-hook 'eglot--managed-mode-hook (lambda () (flymake-mode -1))))
companypolls each backends until one of them can provide complements. But the lsp with the capf backend is not sure if it can provide complements (it needs to wait for the lsp-server to respond), so it tells the company I have candidates by default. This results in later backends not being used, even if the lsp does not return a complement in the end.
:withor considering super-capf from package cape.