diff options
Diffstat (limited to 'lua/lspconfig/pyls_ms.lua')
| -rw-r--r-- | lua/lspconfig/pyls_ms.lua | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/lua/lspconfig/pyls_ms.lua b/lua/lspconfig/pyls_ms.lua new file mode 100644 index 00000000..a1a8b687 --- /dev/null +++ b/lua/lspconfig/pyls_ms.lua @@ -0,0 +1,153 @@ +local configs = require 'lspconfig/configs' +local util = require 'lspconfig/util' + +local name = "pyls_ms" + +local function get_latest_pyls() + local f = io.popen("curl -k --silent 'https://pvsc.blob.core.windows.net/python-language-server-stable?restype=container&comp=list&prefix=Python-Language-Server-osx-x64'") + local l = f:read("*a") + f:close() + local version + for w in string.gmatch (l, "x64%.(.-).nupkg") do + version = w + end + return version +end + +local function make_installer() + local P = util.path.join + local install_dir = P{util.base_install_dir, name} + + local bin = P{install_dir, "Microsoft.Python.LanguageServer.dll"} + local cmd = {"dotnet", "exec", bin} + + local X = {} + function X.install() + local install_info = X.info() + if install_info.is_installed then + print(name, "is already installed") + return + end + if not (util.has_bins("curl")) then + error('Need "curl" to install this.') + return + end + if not (util.has_bins("dotnet")) then + error('Need ".NET Core" to install this.') + return + end + + local system + if vim.fn.has('mac') == 1 then + system = 'osx' + elseif vim.fn.has('unix') == 1 then + system = 'linux' + elseif vim.fn.has('win32') == 1 then + system = 'win' + else + error('Unable to identify host operating system') + end + + local version = get_latest_pyls() + local url = string.format("https://pvsc.azureedge.net/python-language-server-stable/Python-Language-Server-%s-x64.%s.nupkg", string.lower(system), version) + local download_cmd = string.format('curl -fLo %s --create-dirs %s', install_info.install_dir .. "/pyls.nupkg", url) + local install_cmd = '' + + if vim.fn.has('mac') == 1 or vim.fn.has('unix') == 1 then + install_cmd = "unzip " .. install_info.install_dir .. "/pyls.nupkg -d " .. install_info.install_dir + elseif vim.fn.has('win32') == 1 then + install_cmd = "Expand-Archive -Force " .. install_info.install_dir .. "/pyls.nupkg -d " .. install_info.install_dir + end + + vim.fn.system(download_cmd) + vim.fn.system(install_cmd) + end + function X.info() + return { + is_installed = util.path.exists(bin); + install_dir = install_dir; + cmd = cmd; + } + end + function X.configure(config) + local install_info = X.info() + if install_info.is_installed then + config.cmd = cmd + end + end + return X +end + +local installer = make_installer() + +configs[name] = { + + default_config = { + filetypes = {"python"}; + root_dir = function(fname) + return util.find_git_ancestor(fname) or vim.loop.os_homedir() + end; + settings = { + python = { + analysis = { + errors = {}; + info = {}; + disabled = {}; + }; + }; + }; + on_new_config = function(config) + installer.configure(config) + end; + init_options = { + interpreter = { + properties = + { + InterpreterPath = ""; + Version = ""; + }; + }; + displayOptions = {}; + analysisUpdates = true; + asyncStartup = true; + }; + }; + docs = { + description = [[ +https://github.com/Microsoft/python-language-server + +`python-language-server`, a language server for Python. + +Requires [.NET Core](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-install-script) to run. On Linux or macOS: + +```bash +curl -L https://dot.net/v1/dotnet-install.sh | sh +``` + +`python-language-server` can be installed via `:LspInstall pyls_ms` or you can [build](https://github.com/microsoft/python-language-server/blob/master/CONTRIBUTING.md#setup) your own. + +If you want to use your own build, set cmd to point to `Microsoft.Python.languageServer.dll`. + +```lua +cmd = { "dotnet", "exec", "path/to/Microsoft.Python.languageServer.dll" }; +``` + +If the `python` interpreter is not in your PATH environment variable, set the `InterpreterPath` and `Version` properties accordingly. + +```lua +InterpreterPath = "path/to/python", +Version = "3.8" +``` + +This server accepts configuration via the `settings` key. + + ]]; + default_config = { + root_dir = "vim's starting directory"; + }; + }; +}; + +configs[name].install = installer.install +configs[name].install_info = installer.info +-- vim:et ts=2 sw=2 |
