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

像我这种渣渣, 刚开始学点 python, 严重信赖补全. 可无论是 mspyls 还是 pyright 都只能部分补全吗? 请教各位大佬有没有现成的补救方案?

emacs 中用 nox + pyright 补全 emacs

vscode 中的补全为啥就这么全哦, 真羡慕… vscode

我记得nox不是依赖posframe吗,在终端下能用?

反正我还用得挺好的, 响应很快速, 用起来很舒服

vscode 的截图里显示了 tabnine,或许你可以在 Emacs 这边也装上 tabnine 试试。

我的 Emacs 里装了 Tabnine, 也不能完整补全. Vscode 里面我还特意试了, 除了 Tabnine 外, 其他补全也是很全的.

应该是没有索引lib,看看mspyls和pyright的配置

问题是你的截图里展示出来 vscode 就是 tabnine 起的作用,还有 Emacs 这边补全的时候你确定用的是 company-tabnine

你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