可以通过 company-transformers
实现 TabNine 和 lsp 同时用
(defun company//sort-by-tabnine (candidates)
(if (or (functionp company-backend)
(not (and (listp company-backend) (memq 'company-tabnine company-backend))))
candidates
(let ((candidates-table (make-hash-table :test #'equal))
candidates-1
candidates-2)
(dolist (candidate candidates)
(if (eq (get-text-property 0 'company-backend candidate)
'company-tabnine)
(unless (gethash candidate candidates-table)
(push candidate candidates-2))
(push candidate candidates-1)
(puthash candidate t candidates-table)))
(setq candidates-1 (nreverse candidates-1))
(setq candidates-2 (nreverse candidates-2))
(nconc (seq-take candidates-1 2)
(seq-take candidates-2 2)
(seq-drop candidates-1 2)
(seq-drop candidates-2 2)))))
(add-to-list 'company-transformers 'company//sort-by-tabnine t)
;; `:separate` 使得不同 backend 分开排序
(add-to-list 'company-backends '(company-lsp :with company-tabnine :separate))
以上代码效果就是, 前 2 个 candidates 是 company-lsp 的, 接着的 2 个是 TabNine 的.