在论坛上看到好几位大神推荐 TabNine,说这是一个会深度学习的补全工具。在 doom-emacs 里简单的用 (package! company-tabnine)倒是安装上了,然后按照说明把 TabNine 加入到 backends 里:

1
(add-to-list 'company-backends #'company-tabnine)

重启 emacs 后执行 M-x company-tabnine-install-binary 安装 TabNine 服务程序,然后应该就可以啦。 可是、但是、可但是,无效! 查看变量 company-backends 的值,发现是(company-capf company-yasnippet company-tabnine),这样把 tabnine 放在了最后,只要前面两个插件能够输出结果,tabnine 就永远不会出结果,至于为什么 company-tabnine 被排在了最后,目前不清楚 doom-emacs 是怎么个逻辑。不知道该怎么设置了,去 doom-emacs 的 discord 讨论组搜索看看,发现可以用 set-company-backend!进行设置,于是尝试配置如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
(def-package! company-tabnine
  :when (featurep! :completion company)
  :config
  (set-company-backend! '(c-mode
                          c++-mode
                          java-mode
                          haskell-mode
                          emacs-lisp-mode
                          lisp-mode
                          sh-mode
                          perl-mode
                          php-mode
                          python-mode
                          go-mode
                          ruby-mode
                          rust-mode
                          js-mode
                          css-mode
                          web-mode
                          org-mode)
    '(company-tabnine))

  ;; Trigger completion immediately.
  ;; (setq company-idle-delay 0)

  ;; Number the candidates (use M-1, M-2 etc to select completions).
  (setq company-show-numbers t)

  ;; Use the tab-and-go frontend.
  ;; Allows TAB to select and complete at the same time.
  (company-tng-configure-default)
  (setq company-frontends
        '(company-tng-frontend
          company-pseudo-tooltip-frontend
          company-echo-metadata-frontend))
  )

重启 emacs,查看 company-backends,果然把 company-tabnine 排在第一位,打开一个示例文件测试,成功!另外还可以把'(company-tabnine)加上其他的补全插件,让多个插件共同起作用,如改成'(company-tabnine company-yasnippet),这样配置则更灵活。

**8 月 20 日更新:** 经过研究 doom-emacs 代码,发现进行如下设置更简单:

1
2
(set-company-backend! 'prog-mode
  'company-tabnine 'company-capf 'company-yasnippet)

如果启用 lsp-mode,那再进行如下设置,即可同时使用 company-lsp 和 company-tabnine 进行补全:

1
(setq +lsp-company-backend '(company-lsp :with company-tabnine :separate))