使用Microsoft Python Language Server

Update: 用新的lsp接口,lsp-mode新接口lsp.el - #6,来自 seagle0128

昨天在这里看到一篇用microsoft python language server的教程,折腾了一下,感觉很不错,在这里分享一下我的配置。

原教程链接:Configuring Emacs, lsp-mode and Microsoft's Visual Studio Code Python language server. - vxlabs

第一步是利用dotnet编译server

  • 这里下载对应平台的dotnet sdk安装, arch linux可以用sudo pacman -S dotnet-sdk
  • 编译server
git clone https://github.com/Microsoft/python-language-server.git
cd python-language-server/src/LanguageServer/Impl
dotnet build -c Release

第二步配置emacs client

;; 编译的server目录
(setq ms-python-dir "/path/python-language-server/output/bin/Release/")


;;; Functions

(defun ms-python--get-python-env()
  "Return list with pyver-string and json-encoded list of python search paths."
  (let ((python (executable-find python-shell-interpreter))
        (ver "import sys; print(f\"{sys.version_info[0]}.{sys.version_info[1]}\");")
        (sp (concat "import json; sys.path.insert(0, '" default-directory "'); print(json.dumps(sys.path))")))
    (with-temp-buffer
      (call-process python nil t nil "-c" (concat ver sp))
      (subseq (split-string (buffer-string) "\n") 0 2))))

;; I based most of this on the vs.code implementation:
;; https://github.com/Microsoft/vscode-python/blob/master/src/client/activation/languageServer/languageServer.ts#L219
;; (it still took quite a while to get right, but here we are!)
(defun ms-python--initialization-options ()
  "Return initialization-options for LP startup."
  (destructuring-bind (pyver pysyspath) (ms-python--get-python-env)
    `(:interpreter (
                    :properties (
                                 :InterpreterPath ,(executable-find python-shell-interpreter)
                                 ;;:DatabasePath ,(file-name-as-directory (expand-file-name "db/" ms-python-dir))
                                  :UseDefaultDatabase true
                                 :Version ,pyver))
                   ;; preferredFormat "markdown" or "plaintext"
                   ;; experiment to find what works best -- over here mostly plaintext
                   :displayOptions (
                                    :preferredFormat "plaintext"
                                    :trimDocumentationLines :json-false
                                    :maxDocumentationLineLength 0
                                    :trimDocumentationText :json-false
                                    :maxDocumentationTextLength 0)
                   :searchPaths ,(json-read-from-string pysyspath))))


(lsp-register-client
 (make-lsp-client
  :new-connection (lsp-stdio-connection
                   (lambda() `("dotnet" ,(concat ms-python-dir "Microsoft.Python.LanguageServer.dll"))))
  :major-modes '(python-mode)
  :server-id 'ms-python
  :initialization-options #'ms-python--initialization-options))

我把上面的代码写到了 ms-python.el中,可以直接下载使用。

运行lsp激活lsp

几个问题

  1. 显示文档时空格会显示为   issues/193
  2. 不支持语法检测,可以用pylint代替

打开python文件时启动lsp

(defun +my-python/enable-lsp()
;; 启动lsp之前启动pyvenv
  (unless pyvenv-virtual-env-name
    (pyvenv-activate "/home/xhcoding/Code/Python/.venv"))
;; 启动lsp
  (lsp)
;; 用pylint检查语法
  (setq-local flycheck-checker 'python-pylint)
  )

 (add-hook 'python-mode-hook #'+my-python/enable-lsp)

%E6%B7%B1%E5%BA%A6%E5%BD%95%E5%B1%8F_emacs-27-0-50_20181123141056

11 个赞

就喜欢您这样在先行者01

赞一个!

这个是不支持lsp-ui的吗?好像除了flychek其它也没有。。

其他都能显示,用了pylint后,flycheck也能用lsp-ui显示。看下你的lsp-ui-sideline-mode的配置有没有问题,检查下面几个变量的值:

 lsp-ui-sideline-enable
 lsp-ui-sideline-show-symbol 
 lsp-ui-sideline-show-hover 
 lsp-ui-sideline-show-flycheck 
 lsp-ui-sideline-show-code-actions

我想知道这个函数 lsp-ms-python-enable 定义在哪里

(lsp-define-stdio-client lsp-ms-python "python"
                         nil
                         `("dotnet" ,(concat ms-python-dir "Microsoft.Python.LanguageServer.dll"))
                         :extra-init-params #'ms-python-extra-init-params)

这里定义一个lsp客户端后,就会有lsp-ms-python-enable

1 个赞

Debugger entered–Lisp error: (wrong-type-argument lsp–workspace nil) 我有一个这样的报错

M-x toggle-debug-on-error查看更详细的报错信息

你用的lsp-mode company-lsp都是哪个版本的呢

赞一个!使用感受能对比下就更好了。 楼主是用的doom还是centaur啊?

不去给lsp-python提个pr?

我用的是doom-emacs。我选择用这个服务端主要是因为pyls在我电脑没法很好的运行,会出现这个问题:jedi fork大量python进程 - #3,来自 songpeng ,导致用着很卡。

暂时没这打算,这个还不是很稳定。

额,话说我按照你的方法配置了这个后端,但是感觉跟vscode上的效果差了不是一点点啊,你用着还好吗

具体是哪点?我没用过vscode

有人试过微软的cpptools吗?看起来用这套方案也能跑的样子

按照楼主发的配置有问题,我按照楼主提供的那个链接vxlabs配置成功了。 使用感受来讲,还是有点卡,有点慢。流畅度完全不及vscode。我重新用回了anaconda。不过保持隔段时间关注下