1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
local configs = require 'nvim_lsp/configs'
local util = require 'nvim_lsp/util'
local name = "sumneko_lua"
local bin_name = "lua-language-server"
local function make_installer()
local P = util.path.join
local install_dir = P{util.base_install_dir, name}
local git_dir = P{install_dir, bin_name}
local os, bin, ninja_zip, build_file
if vim.fn.has('osx') == 1 then
os = 'macOS'
bin = P{git_dir, "bin", "macOS", bin_name}
ninja_zip = "ninja-mac.zip"
build_file = "macos.ninja"
elseif vim.fn.has('unix') == 1 then
os = 'Linux'
bin = P{git_dir, "bin", "Linux", bin_name}
ninja_zip = "ninja-linux.zip"
build_file = "linux.ninja"
end
local main_file = P{git_dir, "main.lua"}
local cmd = {bin, '-E', main_file}
local X = {}
function X.install()
if os == nil then
error("This installer supports Linux and macOS only")
return
end
local install_info = X.info()
if install_info.is_installed then
print(name, "is already installed")
return
end
if not (util.has_bins("ninja") or util.has_bins("curl")) then
error('Need either "ninja" or "curl" (to download ninja) to install this.')
return
end
if not util.has_bins("sh", "chmod", "unzip") then
error('Need the binaries "sh", "chmod", "unzip" to install this')
return
end
local script = [=[
set -e
bin_name=]=]..bin_name..'\n'..[=[
ninja_zip=]=]..ninja_zip..'\n'..[=[
build_file=]=]..build_file..'\n'..[=[
# Install ninja if not available.
which ninja >/dev/null || {
test -x ninja || {
curl -LO https://github.com/ninja-build/ninja/releases/download/v1.9.0/$ninja_zip
unzip $ninja_zip
chmod +x ninja
}
export PATH=$PWD:$PATH
}
# clone project
git clone https://github.com/sumneko/$bin_name
cd $bin_name
git submodule update --init --recursive
# build
cd 3rd/luamake
ninja -f ninja/$build_file
cd ../..
./3rd/luamake/luamake rebuild
]=]
vim.fn.mkdir(install_info.install_dir, "p")
util.sh(script, install_info.install_dir)
end
function X.info()
return {
is_installed = util.has_bins(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 = {'lua'};
root_dir = function(fname)
return util.find_git_ancestor(fname) or vim.loop.os_homedir()
end;
log_level = vim.lsp.protocol.MessageType.Warning;
};
on_new_config = function(config)
installer.configure(config)
end;
docs = {
vscode = "sumneko.lua";
description = [[
https://github.com/sumneko/lua-language-server
Lua language server. **By default, this doesn't have a `cmd` set.** This is
because it doesn't provide a global binary. We provide an installer for Linux
and macOS using `:LspInstall`. If you wish to install it yourself, [here is a
guide](https://github.com/sumneko/lua-language-server/wiki/Build-and-Run).
]];
default_config = {
root_dir = [[root_pattern(".git") or os_homedir]];
};
};
}
configs[name].install = installer.install
configs[name].install_info = installer.info
-- vim:et ts=2
|