Added support for Microsoft Python Language Server
<<26/04/2019>> Incorporated feedback from robbyoconnor and yyoncho. Rebased. <<08/04/2019>> Rebased on develop tip <<17/04/2019>> Rebased <<02/06/2019>> Rebased. Incorporated feedback from duianto.
This commit is contained in:
parent
06730f24cc
commit
00b2db982d
|
@ -2045,7 +2045,11 @@ Other:
|
||||||
- Use =python-mode= for SCons script files (thanks to shanemikel)
|
- Use =python-mode= for SCons script files (thanks to shanemikel)
|
||||||
- Added LSP support, which can be used by enabling the =lsp= layer and setting
|
- Added LSP support, which can be used by enabling the =lsp= layer and setting
|
||||||
the =python= layer's =python-backend= variable to =lsp=
|
the =python= layer's =python-backend= variable to =lsp=
|
||||||
(thanks to Yuan Fu and Sylvain Benner)
|
(thanks to Yuan Fu and Sylvain Benner).
|
||||||
|
- The LSP backend can use either the =pyls= (default) server or the =mspyls=
|
||||||
|
(Microsoft) implementation, which may be selected by setting the
|
||||||
|
=python-lsp-server= layer variable to =mspyls=
|
||||||
|
(thanks to Cormac Cannon).
|
||||||
- Added ~SPC m t l~ key binding to re-run the last test command
|
- Added ~SPC m t l~ key binding to re-run the last test command
|
||||||
(thanks to Benoit Coste).
|
(thanks to Benoit Coste).
|
||||||
- Added support for breakpoints for the =trepan3k= python debugger
|
- Added support for breakpoints for the =trepan3k= python debugger
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
- [[#backends][Backends]]
|
- [[#backends][Backends]]
|
||||||
- [[#anaconda][Anaconda]]
|
- [[#anaconda][Anaconda]]
|
||||||
- [[#language-server-protocol][Language Server Protocol]]
|
- [[#language-server-protocol][Language Server Protocol]]
|
||||||
|
- [[#python-language-server][python-language-server]]
|
||||||
|
- [[#microsoft-python-language-server][Microsoft python language server]]
|
||||||
- [[#additional-tools][Additional tools]]
|
- [[#additional-tools][Additional tools]]
|
||||||
- [[#syntax-checking][Syntax checking]]
|
- [[#syntax-checking][Syntax checking]]
|
||||||
- [[#test-runner][Test runner]]
|
- [[#test-runner][Test runner]]
|
||||||
|
@ -46,7 +48,9 @@ This layer adds support for the Python language.
|
||||||
** Features:
|
** Features:
|
||||||
- Support for the following backends:
|
- Support for the following backends:
|
||||||
- [[https://github.com/proofit404/anaconda-mode][anaconda]] (default),
|
- [[https://github.com/proofit404/anaconda-mode][anaconda]] (default),
|
||||||
- [[https://github.com/emacs-lsp/lsp-python][Language Server Protocol]] (experimental),
|
- [[https://github.com/emacs-lsp/lsp-python][Language Server Protocol]] (experimental - 2 implementations),
|
||||||
|
- python-language-server
|
||||||
|
- Microsoft python language server
|
||||||
- Auto-completion
|
- Auto-completion
|
||||||
- Code Navigation
|
- Code Navigation
|
||||||
- Documentation Lookup using [[https://github.com/proofit404/anaconda-mode][anaconda-mode]] and [[https://github.com/tsgates/pylookup][pylookup]]
|
- Documentation Lookup using [[https://github.com/proofit404/anaconda-mode][anaconda-mode]] and [[https://github.com/tsgates/pylookup][pylookup]]
|
||||||
|
@ -87,6 +91,14 @@ Backend can be chosen on a per project basis using directory local variables
|
||||||
|
|
||||||
*Note:* you can easily add a directory local variable with ~SPC f v d~.
|
*Note:* you can easily add a directory local variable with ~SPC f v d~.
|
||||||
|
|
||||||
|
The available options are:
|
||||||
|
|
||||||
|
| symbol | description |
|
||||||
|
|-----------+----------------------------------|
|
||||||
|
| 'anaconda | Default |
|
||||||
|
| 'lsp | python-language-server package |
|
||||||
|
| 'lsp-ms | Microsoft python language server |
|
||||||
|
|
||||||
* Backends
|
* Backends
|
||||||
** Anaconda
|
** Anaconda
|
||||||
=anaconda-mode= tries to install the dependencies itself but sometimes
|
=anaconda-mode= tries to install the dependencies itself but sometimes
|
||||||
|
@ -113,6 +125,22 @@ setting your =PYTHONPATH= as explained at
|
||||||
[[https://github.com/proofit404/anaconda-mode#pythonpath]]
|
[[https://github.com/proofit404/anaconda-mode#pythonpath]]
|
||||||
|
|
||||||
** Language Server Protocol
|
** Language Server Protocol
|
||||||
|
|
||||||
|
The =lsp= backend can use either of the following language server implementations:
|
||||||
|
|
||||||
|
| symbol | description |
|
||||||
|
|---------+------------------------------------------|
|
||||||
|
| 'pyls | python-language-server package (default) |
|
||||||
|
| 'mspyls | Microsoft python language server |
|
||||||
|
|
||||||
|
=pyls= is used by default - to use the Microsoft server, set the =python-lsp-server=
|
||||||
|
layer variable as follows:
|
||||||
|
|
||||||
|
#+BEGIN_SRC elisp
|
||||||
|
(python :variables python-backend 'lsp python-lsp-server 'mspyls)
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
*** python-language-server
|
||||||
You just have to install python language server package:
|
You just have to install python language server package:
|
||||||
|
|
||||||
#+BEGIN_SRC sh
|
#+BEGIN_SRC sh
|
||||||
|
@ -133,6 +161,32 @@ dependencies in a pipenv environment, you'll want to set the ~python-pipenv-acti
|
||||||
config variable to ~t~. This activates your pipenv before enabling the
|
config variable to ~t~. This activates your pipenv before enabling the
|
||||||
lsp backend.
|
lsp backend.
|
||||||
|
|
||||||
|
*** Microsoft python language server
|
||||||
|
Paraphrasing the instructions provided by the author of the =lsp-python-ms= package:
|
||||||
|
|
||||||
|
#+BEGIN_SRC sh
|
||||||
|
git clone https://github.com/Microsoft/python-language-server.git
|
||||||
|
cd python-language-server/src/LanguageServer/Impl
|
||||||
|
dotnet build -c Release
|
||||||
|
dotnet publish -c Release -r <RUNTIME>
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
where ~<RUNTIME>~ is one of the [[https://docs.microsoft.com/en-us/dotnet/core/rid-catalog][runtime IDs supported by dotnet core]]. One of ~linux-x64~, ~osx-x64~, ~win10-x64~ should
|
||||||
|
cover most use cases.
|
||||||
|
|
||||||
|
The default package configuration assumes the executable is located in a folder included in your system path.
|
||||||
|
To use the latest built version in a cloned git repo, use the ~python-lsp-git-root~ config variable, e.g.:
|
||||||
|
|
||||||
|
#+BEGIN_SRC elisp
|
||||||
|
(setq-default dotspacemacs-configuration-layers
|
||||||
|
'((python :variables
|
||||||
|
python-backend 'lsp-ms
|
||||||
|
python-lsp-git-root "~/dev/python/python-language-server")))
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
N.B. If you're using Arch linux or a derivative distribution, you can install the =microsoft-python-language-server=
|
||||||
|
package from the AUR.
|
||||||
|
|
||||||
* Additional tools
|
* Additional tools
|
||||||
** Syntax checking
|
** Syntax checking
|
||||||
Syntax checking uses =flake8= package:
|
Syntax checking uses =flake8= package:
|
||||||
|
|
|
@ -18,6 +18,13 @@
|
||||||
"The backend to use for IDE features. Possible values are `anaconda'
|
"The backend to use for IDE features. Possible values are `anaconda'
|
||||||
and `lsp'.")
|
and `lsp'.")
|
||||||
|
|
||||||
|
(defvar python-lsp-server 'pyls
|
||||||
|
"Language server to use for lsp backend. Possible values are `pyls'
|
||||||
|
and `mspyls'")
|
||||||
|
|
||||||
|
(defvar python-lsp-git-root nil
|
||||||
|
"If non-nil, use a development version of the language server in this folder")
|
||||||
|
|
||||||
(defvar python-pipenv-activate nil
|
(defvar python-pipenv-activate nil
|
||||||
"If non-nil, activate pipenv before enabling backend")
|
"If non-nil, activate pipenv before enabling backend")
|
||||||
|
|
||||||
|
|
|
@ -18,16 +18,15 @@
|
||||||
|
|
||||||
(defun spacemacs//python-setup-company ()
|
(defun spacemacs//python-setup-company ()
|
||||||
"Conditionally setup company based on backend."
|
"Conditionally setup company based on backend."
|
||||||
(pcase python-backend
|
(if (eq python-backend `anaconda)
|
||||||
(`anaconda (spacemacs//python-setup-anaconda-company))
|
(spacemacs//python-setup-anaconda-company)
|
||||||
(`lsp (spacemacs//python-setup-lsp-company))))
|
(spacemacs//python-setup-lsp-company)))
|
||||||
|
|
||||||
(defun spacemacs//python-setup-eldoc ()
|
(defun spacemacs//python-setup-eldoc ()
|
||||||
"Conditionally setup eldoc based on backend."
|
"Conditionally setup eldoc based on backend."
|
||||||
(pcase python-backend
|
(pcase python-backend
|
||||||
;; lsp setup eldoc on its own
|
;; lsp setup eldoc on its own
|
||||||
(`anaconda (spacemacs//python-setup-anaconda-eldoc))))
|
(spacemacs//python-setup-anaconda-eldoc)))
|
||||||
|
|
||||||
|
|
||||||
;; anaconda
|
;; anaconda
|
||||||
|
|
||||||
|
@ -89,8 +88,8 @@
|
||||||
(defun spacemacs//python-default ()
|
(defun spacemacs//python-default ()
|
||||||
"Defaut settings for python buffers"
|
"Defaut settings for python buffers"
|
||||||
(setq mode-name "Python"
|
(setq mode-name "Python"
|
||||||
tab-width python-tab-width
|
tab-width python-tab-width
|
||||||
fill-column python-fill-column)
|
fill-column python-fill-column)
|
||||||
|
|
||||||
;; since we changed the tab-width we need to manually call python-indent-guess-indent-offset here
|
;; since we changed the tab-width we need to manually call python-indent-guess-indent-offset here
|
||||||
(when python-spacemacs-indent-guess
|
(when python-spacemacs-indent-guess
|
||||||
|
@ -187,10 +186,10 @@ as the pyenv version then also return nil. This works around https://github.com/
|
||||||
"autoflake --remove-all-unused-imports -i unused_imports.py"
|
"autoflake --remove-all-unused-imports -i unused_imports.py"
|
||||||
(interactive)
|
(interactive)
|
||||||
(if (executable-find "autoflake")
|
(if (executable-find "autoflake")
|
||||||
(progn
|
(progn
|
||||||
(shell-command (format "autoflake --remove-all-unused-imports -i %s"
|
(shell-command (format "autoflake --remove-all-unused-imports -i %s"
|
||||||
(shell-quote-argument (buffer-file-name))))
|
(shell-quote-argument (buffer-file-name))))
|
||||||
(revert-buffer t t t))
|
(revert-buffer t t t))
|
||||||
(message "Error: Cannot find autoflake executable.")))
|
(message "Error: Cannot find autoflake executable.")))
|
||||||
|
|
||||||
(defun spacemacs//pyenv-mode-set-local-version ()
|
(defun spacemacs//pyenv-mode-set-local-version ()
|
||||||
|
|
|
@ -43,6 +43,8 @@
|
||||||
;; packages for anaconda backend
|
;; packages for anaconda backend
|
||||||
anaconda-mode
|
anaconda-mode
|
||||||
(company-anaconda :requires company)
|
(company-anaconda :requires company)
|
||||||
|
;; packages for Microsoft LSP backend
|
||||||
|
(lsp-python-ms :requires lsp-mode)
|
||||||
))
|
))
|
||||||
|
|
||||||
(defun python/init-anaconda-mode ()
|
(defun python/init-anaconda-mode ()
|
||||||
|
@ -420,3 +422,18 @@ fix this issue."
|
||||||
(eq 'yapf python-formatter))
|
(eq 'yapf python-formatter))
|
||||||
(add-hook 'python-mode-hook 'yapf-mode)))
|
(add-hook 'python-mode-hook 'yapf-mode)))
|
||||||
:config (spacemacs|hide-lighter yapf-mode)))
|
:config (spacemacs|hide-lighter yapf-mode)))
|
||||||
|
|
||||||
|
(defun python/init-lsp-python-ms ()
|
||||||
|
(use-package lsp-python-ms
|
||||||
|
:if (eq python-lsp-server 'mspyls)
|
||||||
|
:ensure nil
|
||||||
|
:config
|
||||||
|
|
||||||
|
(if python-lsp-git-root
|
||||||
|
;; Use dev version of language server checked out from github
|
||||||
|
(progn
|
||||||
|
(setq lsp-python-ms-dir
|
||||||
|
(expand-file-name (concat python-lsp-git-root "/output/bin/Release/")))
|
||||||
|
(message "lsp-python-ms: Using version at `%s'" lsp-python-ms-dir))
|
||||||
|
;; Use a precompiled exe
|
||||||
|
(setq lsp-python-ms-executable "Microsoft.Python.LanguageServer"))))
|
||||||
|
|
Loading…
Reference in a new issue