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

主要如下

  1. 初始化选项向 vscode 的插件看齐,添加了 typeshed 路径以及其他的两个参数。ms-pyls 可以使用typeshed 的设置来提供更多的补全。例如如下代码:
    import collections
    q = collections.deque()
    q.
    

不使用 typeshed 的时候,q. 后面好像出不来补全,使用这个设置之后,会出现比较多的补全项。

  1. 添加了一个参数 lsp-python-executable-cmd, 用来解决在 PATH 里面存在 python2python3, 并且 python 默认指向 python2(例如 macos), 而平时使用都用 python3 的问题。

  2. searchPaths 的参数修正,这个可能需要大家帮忙测试一下,主要解决的问题是 *lsp-log* 里面出现 Reloading modules... 之类的提示,导致有些内置包出现 unresolved import 的问题。查看 vscode 的插件后,发现这个变量不应该把系统的 sys.path 内容放进去,那个应该是 ms-pyls 自动查找的,只需要放进去 lsp-python-ms-extra-paths 的设置即可。我这样设置之后,没出现过上面的问题了。

6 个赞

想借机问一下,有人用 lsp 来写大型的工业级项目吗?我用 lsp 写公司的项目非常卡(代码量百万级),换回 PyCharm 了。

不错不错,很好的改进!

发现一个问题,增加"Typeshed"后出现以下错误导致lsp无法启动。环境是Emacs27+macOS

lsp--make-message: Wrong type argument: consp, nil

emm,目前看来,如果用lsp-python-ms,那么性能应该是跟vscode一样的。如果说慢的话,可能emacs27 native json的引入会加快很多吧。

额,跟你之前报的那个 bug 一样的问题,应该是 27 版本的 emacs, 对于这些参数,只认 vector, 不认 list. 我看看改下。

把新增的两个参数变成 vector 了。我拿 emacs27 测试了一下,应该没问题了。

1 个赞

麻烦能帮忙测试下tensorflow这个package吗?

我目前测试下来,在conda环境下安装的tensorflow,msplys直接用的是vscode编译好的,也用vscode打开了这个项目,看着进度条index完了。

奇怪的是vscode下jump to defiition over tensorflow是能精确跳转的,但是emacs下并不能。emacs用的是conda.el。报的错是lsp-request: Object reference not set to an instance of an object.

不知道你说的精确跳转是指什么。我简单测试了一下,没什么问题。不过我环境不是 conda, 直接 pip install tensorflow 的。

Untitled1

就是lsp-ui-peek-find-definitions不work。

我上面那个简单的例子和环境,这个跳转可以工作。

用了 Emacs 27 + json,速度确实有改善。

第二点应该加入到lsp-python-ms的readme中,我遇到这个问题了,找了挺久的答案

应该如何设置 lsp-python-ms-extra-paths 这个变量才能包含正在编辑的当前python文件下的模块呢?比如我有a.py b.py两个文件,并且b.py 中import a,但是lsp-python0-ms提示说 unresolved model a 看搜索路径也没有b.py所在的当前路径

The following clients were selected based on priority: (server-id mspyls, priority 1)
Analysis cache path: /home/lsl/.cache/Microsoft/Python Language Server
Microsoft Python Language Server version 0.4.127.0
Workspace root: /home/lsl/golang/src/api.u.xunlei.com
GetCurrentSearchPaths /usr/bin/python3 
Interpreter search paths:
    /usr/lib/python3.6
    /usr/lib/python3.6/lib-dynload
    /home/lsl/.local/lib/python3.6/site-packages
    /usr/local/lib/python3.6/dist-packages
    /usr/lib/python3/dist-packages
    /usr/lib/python3.6/dist-packages
User search paths:
Initializing for /usr/bin/python3
Analysis caching mode: None.
Analyzing in background, 16 items left...

当前的配置是

(use-package lsp-python-ms
  :ensure t
  :custom
    ;; lsp-python-executable-cmd, 用来解决在 PATH 里面存在 python2 和 python3,
  ;; 并且 python 默认指向 python2(例如 macos), 而平时使用都用 python3 的问题。
  (lsp-python-ms-python-executable-cmd "python3")
  (lsp-python-ms-extra-paths (list "."))
  :config
  )

我没有作任何多余的配置,效果如下:

配置方便贴一下么?谢谢!

而且我发现如果使用默认的python2的话,不会有b.py 不能import a.py的情况,但是同时,也不能import python3中安装的requests等包。

OMG,你的需求真神奇!Python2 要 import Python3 中的包,好奇你的项目如何跑起来的

不是python2要import python3的包,我mint系统上python2和python3都安装了,而且我 平时开发都是用的python3,用pip3安装的包也都是python3下面的,如果配置要是

(use-package lsp-python-ms
  :ensure t
  :config
  )

那么b.py import a.py是没有问题的,但是此时,如果import requests,就会提示unsolved import requests,因为此时lsp-python-ms是用的python2,而requests是安装在python3的目录下的。

但是如果我添加了

(lsp-python-ms-python-executable-cmd "python3")

问题正好相反:requests可以正常import,但是a.py不能import,有点奇怪。 我是希望每个脚本打开的时候可以自动将当前的目录添加到 lsp-python-ms-extra-paths 中,然后再连接ms 的python lsp

如果是下面这样的配置,其实也能用,但是我希望能够动态的设置lsp-python-ms-extra-paths

(use-package lsp-python-ms
  :ensure t
  :custom
  ;; lsp-python-executable-cmd, 用来解决在 PATH 里面存在 python2 和 python3,
  ;; 并且 python 默认指向 python2(例如 macos), 而平时使用都用 python3 的问题。
  (lsp-python-ms-python-executable-cmd "python3")
  (lsp-python-ms-extra-paths "path-to-a.py")
  :config
  )