company-mode 如何按种类排序

想将company-mode的补全list按种类排序,比方说company-backends为(company-lsp company-dabbrev-code company-dabbrev)的情况下,company-lsp的内容排序 > company-dabbrev-code排序 > company-dabbrev的排序。然后在有yasnippet的情况下,yasnippet的内容永远在最后。

求教解法~感觉得写个company-transformers函数,然而自己的elisp捉急~

1 个赞

我在doom-emacs裏用(set! :company-backend '(c-mode c++-mode objc-mode) 'company-lsp) (ccls,昨天加了system include path inference)

打開c++-mode buffer後默認company-backends(company-lsp company-dabbrev-code company-dabbrev)

當有多個backends時,company-mode會排序company-lsp返回的結果(不想要的,因爲language server返回的結果是根據相關度排序的)

我猜測需要在哪裏設置company-lsp這個backend返回的結果已經是sorted的,但不知道在哪裏弄

解決了,設法弄成:

(setq company-backends '(company-lsp (:separate company-capf company-dabbrev)))

這裏:separate會防止不同backends的candidates被合併到一起(並排序)

暫時這樣:

(after! company
  (setq company-minimum-prefix-length 2
        company-quickhelp-delay nil
        company-show-numbers t
        company-backends '((:separate company-capf company-dabbrev))
        company-global-modes '(not comint-mode erc-mode message-mode help-mode gud-mode)
        ))

然後在c-mode c+±mode objc-mode中: https://github.com/maskray/Config/blob/master/home/.config/doom/modules/private/my-cc/config.el#L51

(def-package! ccls
  :load-path "~/Dev/Emacs/emacs-ccls"
  :init (add-hook! (c-mode c++-mode objc-mode) #'+ccls//enable)
  :config
  ;; overlay is slow
  ;; Use https://github.com/emacs-mirror/emacs/commits/feature/noverlay
  (setq ccls-sem-highlight-method 'font-lock)
  (ccls-use-default-rainbow-sem-highlight)
  (setq ccls-extra-init-params
        '(:completion (:detailedLabel t)
                      :diagnostics (:frequencyMs 5000)
                      :index (:initialReparseForDependency :json-false)))

  (with-eval-after-load 'projectile
    (add-to-list 'projectile-globally-ignored-directories ".ccls-cache"))

  (evil-set-initial-state 'ccls-tree-mode 'emacs)
  (set! :company-backend '(c-mode c++-mode objc-mode) 'company-lsp)
  )

算是“真香”吗?:sweat_smile:

1 个赞

separate过后其他的backends好像就没有用了。我用diminish-undo -> company-mode查看company-backend的方法试了下。

比方说这种情况下

company-backends-rjsx-mode’s value is
(company-lsp
 (:separate company-files company-capf))

company-files并不起效果。