[分享]关于Eglot在Windows系统下无法使用pyright的问题

不知道从哪个版本开始,在 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 有什么特殊作用,我这样覆盖会不会有什么副作用?

git init下,让project.el使用vc backend应该就可以了

:+1: 这也是个不错的办法。

不知道 project.el 能否设置 fd 代替 find? fd 应该更快一些。

可以设置,我用的这篇文章的方法,在 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。

多谢,这个也有用。我用 ripgrep 比较多。

pyright不能补全函数或方法参数,你们也是么

可以啊。你什么样的不能补全? 发给例子来看看?

 ;; 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 如果函数带参数,则一样。 out

你说的是这个啊。我这里也是不能补全()的,跟你的一样。

:joy: :joy: :joy: :joy: :joy: :joy: :joy: :joy: :joy:

不知道这个是 pyright 的问题还是 eglot 的问题。
用 eglot + clangd 写 C++ 的时候,如果安装了 yasnippet 是可以补全括号以及里面的参数的。

那就是 eglot 的问题了,得去上游反馈问题。

我用的lsp :joy: 你怎么配置的呀

eglot 现在支持 pyright 自动插入 import 了。 Fix #769: support autoImportText from pyright language server by fbergroth · Pull Request #771 · joaotavora/eglot · GitHub

1 个赞