给 lsp-python-ms 添加了一点功能

(setq python-shell-interpreter "python3")
(setq lsp-python-ms-python-executable-cmd "python3")

Add lsp-python-ms-extra-paths to .dir-locals.el

(use-package lsp-python-ms
  :ensure t
  ;需要延迟加载,因为脚本regist client时候依赖动态改变的lsp-python-ms-extra-paths
  :defer t
  :custom
  ;; lsp-python-executable-cmd, 用来解决在 PATH 里面存在 python2 和 python3,
  ;; 并且 python 默认指向 python2(例如 macos), 而平时使用都用 python3,
  ;; 这样不能引用python3 下面的包
  (lsp-python-ms-python-executable-cmd "python3")

  :config
  )

(use-package python-mode
  :ensure t
  :hook (
         (python-mode . lsp-deferred)
         (python-mode . (lambda ()
                          (setq lsp-python-ms-extra-paths (list (file-name-directory buffer-file-name)))
                          (require 'lsp-python-ms)
                          ))
         )
  :config
  )

不想使用dir-locals,我试了一下,这样配置比较符合我使用的场景

1 个赞

当前模块下面其实重点是你的工程设置,例如 projectile 的。 extra-path 这个变量是防止一些不在 site-packages 里面的额外库的。一般不需要特别设置。

这里就是有个奇怪的地方,为什么lsp-python-ms-python-executable-cmd设置成python3以后,没有把当前buffer所在的当前目录传递给python ms lsp解析呢,默认的python2就不存在这个问题

最简单的办法,创建一个 symlink,python3python

Update:GitHub - emacs-lsp/lsp-python-ms: lsp-mode Microsoft's python language server

试过这种方法了,没有效果,依然不能import当前同目录下的py文件

看下你贴出来的图,主要的问题是,其中有一句 "Workspace root: /home/…/app_config ", 所以ms-pyls补全时候默认是寻找的 app_config 里面的模块,而你要补全的库在 …app_config/test 下面, 所以找不到。

这里我现在忽然发现,当前目录下的包如果使用 from . import xxxx 这种方式引用的话,lsp-python-ms是可以正常解析的,这么写也比较规范,以前是我用错了

好棒!回头试试!