不知道从哪个版本开始,在 Windows 10 下的 pyright 没法配合 eglot 一起使用。
今天检查了一下,发现原来是因为 Windows 系统下的 C:\Windows\System32\find.exe
在捣鬼。
Eglot 依赖 project
这个包,project
会使用 find 这个程序,但不是Windows 系统下的 find.exe
。
要解决这个问题,下载正确的 findutils 并添加到系统 PATH 中即可。
希望对同样需要在 Windows 下使用 project
的朋友有帮助。
参考eglot issue #768:
另问:不知道 windows 的 find.exe 有什么特殊作用,我这样覆盖会不会有什么副作用?
wsw
2
git init下,让project.el使用vc backend应该就可以了
不知道 project.el 能否设置 fd
代替 find
? fd 应该更快一些。
Shaun
5
可以设置,我用的这篇文章的方法,在 Linux 下是这样设置的,Windows 应该也适用
(defun my--project-files-in-directory (dir)
"Use `fd' to list files in DIR."
(let* ((default-directory dir)
(localdir (file-local-name (expand-file-name dir)))
(command (format "fd -H -t f -0 . %s" localdir)))
(project--remote-file-names
(sort (split-string (shell-command-to-string command) "\0" t)
#'string<))))
(cl-defmethod project-files ((project (head local)) &optional dirs)
"Override `project-files' to use `fd' in local projects."
(mapcan #'my--project-files-in-directory
(or dirs (list (project-root project)))))
这个不清楚,不过倒是可以通过设置 (setq xref-search-program 'ripgrep)
,来让 project-find-regexp
使用 ripgrep。
;; Python: pyright
(use-package lsp-pyright
:preface
;; Use yapf to format
(defun lsp-pyright-format-buffer ()
(interactive)
(when (and (executable-find "yapf") buffer-file-name)
(call-process "yapf" nil nil nil "-i" buffer-file-name)))
:hook (python-mode . (lambda ()
(require 'lsp-pyright)
(add-hook 'after-save-hook #'lsp-pyright-format-buffer t t)))
:init (when (executable-find "python3")
(setq lsp-pyright-python-executable-cmd "python3")))
有补全,但是在补全函数和方法时,不会补全参数,比如
class Test:
def say(self):
pass
t = Test()
补全时,不会自动补全t.say()
结果是t.say
如果函数带参数,则一样。
你说的是这个啊。我这里也是不能补全()的,跟你的一样。
不知道这个是 pyright 的问题还是 eglot 的问题。
用 eglot + clangd 写 C++ 的时候,如果安装了 yasnippet 是可以补全括号以及里面的参数的。
eglot 现在支持 pyright 自动插入 import 了。 Fix #769: support autoImportText from pyright language server by fbergroth · Pull Request #771 · joaotavora/eglot · GitHub
1 个赞