你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
,刚刚忘说了
不过tabnine的emacs端确实卡一些,我没有在继续用
Tabnine 果然被 Nox 覆盖掉了. 我尝试把 Nox 注释掉, Tabnine 又起作用了. 有什么办法可以把它们共存吗?
可以试试 nox-managed-mode-hook
和 nox-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 候选项概率, 可以自成一列对齐吗? 这样出现真丑, 而且容易走眼看成是候选项的一部分
用 company-box
那就不清楚了,我用的 nox
的前身 eglot
,我配置 company
的时候就是这么写的,我这边没有问题。当然我是用的 use-package
,也没有用 company-tabnine
,不清楚你的配置为什么没有生效。
感谢大佬, 很有帮助!