windows 下Doom Emacs 安装配置pyright

安装 pyright

以管理员运行 cmd

1
npm install -g pyright

我这里使用 pip 安装的 pyright 貌似有BUG, 使用npm 安装的则正常

配置Doom Emacs

init.el

1
2
3
4
5
    :lang
    (python +lsp
            +pyright
            ;; +mspyls
            )           ; beautiful is better than ugly

config.el

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
(use-package! lsp-pyright
  :init (when (executable-find "python3")
          (setq lsp-pyright-python-executable-cmd "python3"))
  :hook (python-mode . (lambda ()
                          (require 'lsp-pyright)
                          (lsp))))  ; or lsp-deferred

(use-package! lsp-mode
  ;; :hook ((verilog-mode vhdl-mode) . lsp)
  :config
  (setq lsp-log-io nil
        lsp-auto-configure t
        lsp-auto-guess-root t
        lsp-enable-completion-at-point t
        lsp-enable-xref t
        lsp-enable-indentation t
        lsp-response-timeout 10
        lsp-restart 'auto-restart
        lsp-keep-workspace-alive nil
        lsp-eldoc-render-all t
        lsp-enable-snippet t
        lsp-enable-folding t
        lsp-enable-file-watchers t
        lsp-file-watch-threshold 15000)   ;; 超过15000 个文件才报警
  (advice-add 'lsp :before (lambda (&rest _args) (eval '(setf (lsp-session-server-id->folders (lsp-session)) (ht)))))   ;; 避免pyright 第一次启server 时把 lsp workspace 全分析一遍
  )

doom sync

1
doom sync

重启emacs

包含的文目录过多 (pyright:31912 initialized successfully in folders)

1
2
3
4
5
6
LSP :: pyright:31912 initialized successfully in folders: (fold1 fold2 ... foldx)
Cannot determine Magit’s version (error "e:/Users/wcq/AppData/Roaming/SPB_Data/.emacs.d/.local/straight/build-28.1/magit/magit.el" repo static elpa dirname hash)
Watching all the files in e:/work/tools would require adding watches to 15700 directories, so watching the repo may slow Emacs down.
Do you want to watch all files in e:/work/tools? (y or n) n
LSP :: You can configure this warning with the `lsp-enable-file-watchers' and `lsp-file-watch-threshold' variables
Error processing message (file-missing "Opening directory" "No such file or directory" "c:/Program Files (x86)/sigrok/PulseView/share/libsigrokdecode/decoders/uart").

需要 lsp-pyright-multi-root 的情况下

这个问题可以通过调大 lsp-enable-file-watchers 和 lsp-file-watch-threshold 来消除警告, 但是这不是个好办法,
正常的LSP 工程不应该包含15700 个文件夹, 从消息可以看出 work/tools 这个目录包含了太多文件夹, 我们应该把这个目录从 lsp-session 中移除
方法有两个

1. 直接找到lsp-session 删除里面不需要的目录

C-h v 然后 输入 lsp-session-file


找到lsp-session-file 把不需要的目录删除

2. pyright 通过lsp 的内置命令(lsp-workspace-folders-remove)删除多余的 lsp-session

M-x: lsp-workspace-folders-remove

不需要 lsp-pyright-multi-root 的情况下

参考 config.el
中lsp-mode 里的advice-add
😵 值得注意的是, 按网上找的资料看只要在load lsp-mode 之前把 lsp-pyright-multi-root 设成 nil 应该也能禁止多目录的情况
但是我这里不管怎么试都没有效果…

默认以 projectile 识别的目录为root dir

最简单的就是在工程的根目录中使用 git init 新建一个git 仓库即可

如果碰到 flake8 相关的错误

则重装即可

1
2
pip3 uninstall flake8
pip3 install flake8