mspyls 和 pyright 都只能部分补全吗?

你Emacs的TabNine没有启动。好像是被Nox覆盖了。

大佬帮我把把脉~ 这是我 python 相关的设置

(use-package company
  :ensure t
  :config
  (add-hook 'after-init-hook 'global-company-mode)
  (setq company-idle-delay 0)
  (setq company-show-numbers t)
  (setq completion-ignore-case t)
  (setq company-backends
	'(company-capf
	  company-files
	  company-yasnippet
	  company-tabnine
	  company-keywords))
  (setq company-minimum-prefix-length 1))


(elpy-enable)
(setq elpy-rpc-python-command "python3")

(defun my/python-mode-hook()
  (add-to-list 'company-backends 'company-jedi))
(add-hook 'python-mode-hook 'my/python-mode-hook)
(setq jedi:complete-on-dot t)
(require 'nox)
(dolist (hook (list
	       'python-mode-hook))
  (add-hook hook '(lambda () (nox-ensure))))
(setq nox-python-server "pyright")
;; (setq nox-python-server "mspyls")

怎样显性化设置 Tabnine, 让它发挥作用呢? 请赐教

我 emacs 里也装了 company-tabnine 的

如果用pyright,参考下:https://github.com/microsoft/pyright/blob/master/docs/configuration.md。

你的配置里,jedi都不需要了

这不是pyright的问题,这是company-backends的问题.

vscode的补全后端已经完全没有语义补全了,全是tabnine的,所以你用语义补全得不到tabnine的结果也是正常的.

(而且如果用pyright的话,还是推荐使用lsp-mode+lsp-pyright开箱即用度好到一种程度.


doom有个hack

  (setq my/lsp-backends
		'((company-files company-capf :with company-dabbrev)  
		  (company-keywords)))

  (add-hook 'lsp-completion-mode-hook
			(defun lsp-init-company-backends-h ()
			  (when lsp-completion-mode
				(set (make-local-variable 'company-backends)
					 my/lsp-backends))))

再看看这个

我查了一下 company-backends 的值, 貌似我的 company-tabnine 确实没有起作用. 有现成的方案可以改善这种情况吗, 网上倒是能查到一些关于 doom-emacs 的, 但是对于我这种渣渣来说, 移植过来是比较难的…

company-backends is a variable defined in ‘company.el’.
Its value is (company-capf)
Original value was
(company-bbdb company-semantic company-cmake company-capf company-clang company-files
              (company-dabbrev-code company-gtags company-etags company-keywords)
              company-oddmuse company-dabbrev)
Local in buffer tmp.py; global value is
(company-jedi company-capf company-files company-yasnippet company-tabnine company-keywords)

  This variable is safe as a file local variable if its value
  satisfies the predicate ‘company-safe-backends-p’.
  You can customize this variable.

谢谢您的回答, 但是对我来说从 doom-emacs 把这种配置移植过来比较难

我已经帮你purify了啊,

你把block里的复制过去,再把链接里的内容复制进配置,应该就可以用了

It works! 非常感谢, 我可以继续在 Emacs 工作了, 虽然略卡. 后面再去折腾 Nox

你如果要在emacs用tabnine,那么那段应该要改成

  (setq my/lsp-backends
		'((company-files company-capf :with company-tabnine)  
		  (company-keywords)))

如果不打算用tabnine,那么你要把company//sort-by-tabnine那个函数里所有的tabnine替换成dabbrev,刚刚忘说了 :joy:

不过tabnine的emacs端确实卡一些,我没有在继续用

Tabnine 果然被 Nox 覆盖掉了. 我尝试把 Nox 注释掉, Tabnine 又起作用了. 有什么办法可以把它们共存吗?

这个我也不清楚,得问一下 @manateelazycat

可以试试 nox-managed-mode-hooknox-managed-p

nox-managed-mode-hook : Hook run after Nox started or stopped managing a buffer. Use nox-managed-p to tell if current buffer is still being managed.

类似下面这种

(add-hook 'nox-managed-mode-hook
          #'(lambda ()
              (when (nox-managed-p)
                (setq-local company-backends
                            ...))))

是这么来写吗, 貌似不起作用

 (add-hook 'nox-managed-mode-hook
           #'(lambda ()
               (when (nox-managed-p)
                 (setq-local company-backends
                            (append '(company-tabnine) company-backends)))))

Tabnine 候选项概率, 可以自成一列对齐吗? 这样出现真丑, 而且容易走眼看成是候选项的一部分

tabnine

用 company-box

那就不清楚了,我用的 nox 的前身 eglot,我配置 company 的时候就是这么写的,我这边没有问题。当然我是用的 use-package,也没有用 company-tabnine,不清楚你的配置为什么没有生效。

可以看看我的写法,以前在论坛看到的

感谢大佬, 很有帮助!