company-c-headers与company-capf冲突?

我明明添加了这两个backends,但是却只有company-irony自动触发。 但是我卸载company-irony之后,company-c-headers反倒能自动触发了。 我的配置:

(when (maybe-require-package 'company-c-headers)
  (after-load 'company
    (add-hook 'c-mode-common-hook
              (lambda () (sanityinc/local-push-company-backend 'company-c-headers)))))


;;; Use irony-mode to support auto-complete
(unless *is-macOS*
  (when (maybe-require-package 'irony)
    (add-hook 'c-mode-hook 'irony-mode)
    (add-hook 'c++-mode-hook 'irony-mode)
    (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)))

(after-load 'irony
  (diminish 'irony-mode))

;; Windows tweaks. Please uncomment to use (DO NOT uncomment this line).
;;
;; (when (boundp 'w32-pipe-read-delay)
;;   (setq w32-pipe-read-delay 0))
;; Set the buffer size to 64K on Windows (from the original 4K)
;; (when (boundp 'w32-pipe-buffer-size)
;;   (setq irony-server-w32-pipe-buffer-size (* 64 1024)))

;; Use company
(when (package-installed-p 'irony)
  (when (maybe-require-package 'company-irony)
    (after-load 'company
      (add-hook 'c-mode-common-hook
                (lambda () (sanityinc/local-push-company-backend 'company-irony))))))

company-backends的值:

Value: (company-c-headers company-irony
                   (company-capf company-dabbrev-code)
                   company-dabbrev)

sanityinc/local-push-copmany-backend的代码:

(defun sanityinc/local-push-company-backend (backend)
    "Add BACKEND to a buffer-local version of `company-backends'."
    (set (make-local-variable 'company-backends)
         (append (list backend) company-backends)))

谢谢

感觉一个很简单的配置,写的好复杂。。。。

只是因为我必须实现自动安装而已……所以才如此多的判断

好吧,用怜悯的眼光看着你:grin:

好吧……我的问题提错对象了…… 并不是company-irony有冲突,而是company-capf和company-c-headers有冲突……我把这个后端给删掉就好了…… 但是这个capf到底是干啥用的……

要我来写的话定然是把配置封在函数里,然后对应不同平台的文件里调用函数来方便管理。(学的 Spacemacs)

上 use-package 啊

我已经知道哪儿冲突了…… 实际上。这不关company-c-headers什么事儿……冲突的是company-irony和company-capf…… 因为irony-mode使用completion-at-point-functions和`company-irony这两种前端展示补全……于是它俩就一直打架…… 我删除company-backends里它俩之中的任何一个……世界清静了……

company 会依次尝试company-backends变量里指定的补全策略,直到有一个成功返回,之后就不会尝试后面的策略了,如果你想让company-c-headers 与company-irony 或company-capf同时触发,可以这样写

  (setq-default company-backends
                `((company-c-headers company-irony company-capf)
                  (company-files company-dabbrev company-keywords company-yasnippet)
                company-nxml
                company-css
                company-clang
                company-xcode
                company-cmake
                company-eclim
                company-semantic
                company-capf
                ;;... other backends
                ))

1 个赞