Refactor lsp

This commit is contained in:
2023-09-04 04:19:44 +02:00
parent fd5add50ee
commit 42f4ab623e
13 changed files with 292 additions and 304 deletions
-98
View File
@@ -1,98 +0,0 @@
--[[
Copyright 2023 Oscar Wallberg
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
]]
return {
cmd = { "diagnostic-languageserver", "--stdio", },
single_file_support = true,
-- For more info see https://github.com/iamcco/diagnostic-languageserver
init_options = {
filetypes = { python = "flake8", lua = "luaFormatter", },
linters = {
-- some help from this:
-- https://github.com/creativenull/diagnosticls-configs-nvim/blob/main/lua/diagnosticls-configs/linters/flake8.lua
flake8 = {
command = "flake8",
args = {
"--config",
"tox.ini",
"--format",
"%(row)d,%(col)d,%(code).1s,%(code)s: %(text)s",
"-",
},
rootPatterns = { "Pipfile", ".git", "tox.ini", },
isStdout = true,
isStderr = false,
debounce = 100,
offsetLine = 0,
offsetColumn = 0,
sourceName = "flake8",
formatLines = 1,
formatPattern = {
[[(\d+),(\d+),([A-Z]),(.*)(\r|\n)*$]],
{ line = 1, column = 2, security = 3, message = { 4, }, },
},
securities = {
-- Available securities are { 'error', 'warning', 'hint', 'info' }
E = "error",
W = "warning",
B = "hint",
F = "error",
D = "info",
},
},
},
formatFiletypes = {
python = { "black", "isort", },
sh = { "shfmt", },
},
formatters = {
black = {
sourceName = "black",
command = "black",
args = {
"--stdin-filename",
"%filename",
"-t",
"py39",
"--quiet",
"-",
},
rootPatterns = { "Pipfile", ".git", "tox.ini", },
isStdout = true,
isStderr = false,
ignoreExitCode = false,
},
isort = {
sourceName = "isort",
command = "isort",
args = { "--quiet", "-", },
rootPatterns = { "Pipfile", ".git", "tox.ini", },
isStdout = true,
isStderr = false,
ignoreExitCode = false,
},
shfmt = {
sourceName = "shfmt",
command = "shfmt",
args = { "-s", "-i", "4", "-ci", },
rootPatterns = { "Pipfile", ".git", "tox.ini", },
isStdout = true,
isStderr = false,
ignoreExitCode = false,
},
},
},
}
-55
View File
@@ -1,55 +0,0 @@
--[[
Copyright 2023 Oscar Wallberg
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
]]
return {
cmd = { "jedi-language-server", },
single_file_support = true,
-- For more info see:
-- - https://github.com/pappasam/jedi-language-server#configuration
-- - https://github.com/pappasam/coc-jedi#configuration (good descriptions)
init_options = {
-- Built-in diagnostics seem to be very basic,
-- to the point where you are wondering if it's even active.
-- Will use iamcco/diagnostic-languageserver instead.
diagnostics = {
-- Enables (or disables) diagnostics provided by Jedi
-- type: boolean
-- default: true
enable = false,
},
-- The preferred MarkupKind for all jedi-language-server messages that take MarkupContent.
-- type: string
-- accepted values: "markdown", "plaintext"
-- If omitted, jedi-language-server defaults to the client-preferred configuration.
-- If there is no client-preferred configuration, jedi language server users "plaintext".
-- markupKindPreferred = "markdown",
workspace = {
symbols = {
-- Performance optimization that sets names of folders that are ignored for workspace/symbols.
-- type: string[]
-- default: { ".nox", ".tox", ".venv", "__pycache__", "venv" }
-- If you manually set this option, it overrides the default.
-- Setting it to an empty array will result in no ignored folders.
ignoreFolders = {
".nox", ".tox", ".venv", "__pycache__", "venv",
"artifacts", "config", ".vscode", ".pytest_cache",
"build", "scripts", "incoax_tests.egg-info",
"node_modules",
},
},
},
},
}
+14 -16
View File
@@ -221,7 +221,7 @@ end
function P.reload_server_buf(self, name) function P.reload_server_buf(self, name)
local server = self.servers[name] local server = self.servers[name]
local ft_map = {} local ft_map = {}
for _, ft in ipairs(server.filetypes) do for _, ft in ipairs(server.lspconfig.filetypes) do
ft_map[ft] = true ft_map[ft] = true
end end
for _, bufnr in ipairs(vim.api.nvim_list_bufs()) do for _, bufnr in ipairs(vim.api.nvim_list_bufs()) do
@@ -241,8 +241,8 @@ function P.filetypes(self)
if not self._filetypes then if not self._filetypes then
self._filetypes = {} self._filetypes = {}
local unique = {} local unique = {}
for _, cfg in pairs(self.servers) do for _, server in pairs(self.servers) do
for _, ft in ipairs(cfg.filetypes) do for _, ft in ipairs(server.lspconfig.filetypes) do
if not unique[ft] then if not unique[ft] then
table.insert(self._filetypes, ft) table.insert(self._filetypes, ft)
unique[ft] = true unique[ft] = true
@@ -257,22 +257,21 @@ end
function P.language_servers(self) function P.language_servers(self)
if not self._language_servers then if not self._language_servers then
self._language_servers = {} self._language_servers = {}
for name, opts in pairs(self.servers) do for name, server in pairs(self.servers) do
if opts.dependencies ~= nil then if server.dependencies ~= nil then
for _, dep in ipairs(opts.dependencies) do for _, dep in ipairs(server.dependencies) do
if not utils.is_available(dep) then if not utils.is_available(dep) then
utils.warn( utils.warn(
"Disabling " .. name .. " because " .. dep .. " is required but not installed", "Disabling " .. name .. " because " .. dep .. " is required but not installed",
module_name module_name
) )
opts.enabled = false server.enabled = false
goto next_server goto next_server
end end
end end
end end
if opts.enabled == true then if server.enabled == true then
opts.config = require("lsp.config." .. name)
table.insert(self._language_servers, name) table.insert(self._language_servers, name)
end end
::next_server:: ::next_server::
@@ -283,18 +282,17 @@ function P.language_servers(self)
end end
function P.setup_server(self, name) function P.setup_server(self, name)
local opts = self.servers[name] local server = self.servers[name]
if opts.enabled ~= true then if server.enabled ~= true then
return return
end end
local lspconfig = require("lspconfig") local lspconfig = require("lspconfig")
opts.config.filetypes = opts.filetypes server.lspconfig.root_dir = lspconfig.util.find_git_ancestor
opts.config.root_dir = lspconfig.util.find_git_ancestor server.lspconfig.capabilities = self.capabilities
opts.config.capabilities = self.capabilities server.lspconfig.on_attach = self.on_attach
opts.config.on_attach = self.on_attach lspconfig[name].setup(server.lspconfig)
lspconfig[name].setup(opts.config)
self:reload_server_buf(name) self:reload_server_buf(name)
end end
-94
View File
@@ -1,94 +0,0 @@
--[[
Copyright 2023 Oscar Wallberg
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
]]
local servers = {
clangd = {
enabled = true,
filetypes = {
"c",
"cpp",
"objc",
"objcpp",
"cuda",
"proto",
},
config = {},
},
cmake = {
enabled = true,
filetypes = {
"cmake",
},
config = {},
},
diagnosticls = {
enabled = true,
filetypes = {
"python",
"lua",
"sh",
},
dependencies = {
"npm",
},
config = {},
},
lua_ls = {
enabled = true,
filetypes = {
"lua",
},
config = {},
},
lemminx = {
enabled = true,
filetypes = {
"xml",
"xsd",
"xsl",
"xslt",
"svg",
},
config = {},
},
bashls = {
enabled = true,
filetypes = {
"sh",
},
dependencies = {
"npm",
"shellcheck"
},
config = {},
},
groovyls = {
enabled = true,
filetypes = {
"groovy",
},
config = {},
},
jedi_language_server = {
enabled = true,
filetypes = {
"python",
},
config = {},
},
}
return servers
@@ -15,11 +15,17 @@
]] ]]
return { return {
cmd = { enabled = true,
"clangd", dependencies = {
"--clang-tidy", "npm",
"--enable-config", "shellcheck",
"--log=verbose", },
lspconfig = {
filetypes = {
"sh",
},
cmd = { "bash-language-server", "start", },
cmd_env = { GLOB_PATTERN = "*@(.sh|.inc|.bash|.command)", },
single_file_support = true,
}, },
single_file_support = true,
} }
@@ -15,7 +15,22 @@
]] ]]
return { return {
cmd = { "bash-language-server", "start", }, enabled = true,
cmd_env = { GLOB_PATTERN = "*@(.sh|.inc|.bash|.command)", }, lspconfig = {
single_file_support = true, filetypes = {
"c",
"cpp",
"objc",
"objcpp",
"cuda",
"proto",
},
cmd = {
"clangd",
"--clang-tidy",
"--enable-config",
"--log=verbose",
},
single_file_support = true,
},
} }
@@ -15,9 +15,15 @@
]] ]]
return { return {
cmd = { "cmake-language-server", }, enabled = true,
single_file_support = true, lspconfig = {
init_options = { filetypes = {
buildDirectory = "build", "cmake",
},
cmd = { "cmake-language-server", },
single_file_support = true,
init_options = {
buildDirectory = "build",
},
}, },
} }
+109
View File
@@ -0,0 +1,109 @@
--[[
Copyright 2023 Oscar Wallberg
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
]]
return {
enabled = true,
dependencies = {
"npm",
},
lspconfig = {
filetypes = {
"python",
"lua",
"sh",
},
cmd = { "diagnostic-languageserver", "--stdio", },
single_file_support = true,
-- For more info see https://github.com/iamcco/diagnostic-languageserver
init_options = {
filetypes = { python = "flake8", lua = "luaFormatter", },
linters = {
-- some help from this:
-- https://github.com/creativenull/diagnosticls-configs-nvim/blob/main/lua/diagnosticls-configs/linters/flake8.lua
flake8 = {
command = "flake8",
args = {
"--config",
"tox.ini",
"--format",
"%(row)d,%(col)d,%(code).1s,%(code)s: %(text)s",
"-",
},
rootPatterns = { "Pipfile", ".git", "tox.ini", },
isStdout = true,
isStderr = false,
debounce = 100,
offsetLine = 0,
offsetColumn = 0,
sourceName = "flake8",
formatLines = 1,
formatPattern = {
[[(\d+),(\d+),([A-Z]),(.*)(\r|\n)*$]],
{ line = 1, column = 2, security = 3, message = { 4, }, },
},
securities = {
-- Available securities are { 'error', 'warning', 'hint', 'info' }
E = "error",
W = "warning",
B = "hint",
F = "error",
D = "info",
},
},
},
formatFiletypes = {
python = { "black", "isort", },
sh = { "shfmt", },
},
formatters = {
black = {
sourceName = "black",
command = "black",
args = {
"--stdin-filename",
"%filename",
"-t",
"py39",
"--quiet",
"-",
},
rootPatterns = { "Pipfile", ".git", "tox.ini", },
isStdout = true,
isStderr = false,
ignoreExitCode = false,
},
isort = {
sourceName = "isort",
command = "isort",
args = { "--quiet", "-", },
rootPatterns = { "Pipfile", ".git", "tox.ini", },
isStdout = true,
isStderr = false,
ignoreExitCode = false,
},
shfmt = {
sourceName = "shfmt",
command = "shfmt",
args = { "-s", "-i", "4", "-ci", },
rootPatterns = { "Pipfile", ".git", "tox.ini", },
isStdout = true,
isStderr = false,
ignoreExitCode = false,
},
},
},
},
}
@@ -15,9 +15,15 @@
]] ]]
return { return {
cmd = { enabled = true,
"java", "-jar", lspconfig = {
"/usr/share/java/groovy-language-server/groovy-language-server-all.jar", filetypes = {
"groovy",
},
cmd = {
"java", "-jar",
"/usr/share/java/groovy-language-server/groovy-language-server-all.jar",
},
single_file_support = true,
}, },
single_file_support = true,
} }
+18
View File
@@ -0,0 +1,18 @@
local servers = {
"bashls",
"clangd",
"cmake",
"diagnosticls",
"groovyls",
"jedi_language_server",
"lemminx",
"lua_ls",
}
local manifest = {}
for _, name in ipairs(servers) do
manifest[name] = require("lsp.servers." .. name)
end
return manifest
+61
View File
@@ -0,0 +1,61 @@
--[[
Copyright 2023 Oscar Wallberg
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
]]
return {
enabled = true,
lspconfig = {
filetypes = {
"python",
},
cmd = { "jedi-language-server", },
single_file_support = true,
-- For more info see:
-- - https://github.com/pappasam/jedi-language-server#configuration
-- - https://github.com/pappasam/coc-jedi#configuration (good descriptions)
init_options = {
-- Built-in diagnostics seem to be very basic,
-- to the point where you are wondering if it's even active.
-- Will use iamcco/diagnostic-languageserver instead.
diagnostics = {
-- Enables (or disables) diagnostics provided by Jedi
-- type: boolean
-- default: true
enable = false,
},
-- The preferred MarkupKind for all jedi-language-server messages that take MarkupContent.
-- type: string
-- accepted values: "markdown", "plaintext"
-- If omitted, jedi-language-server defaults to the client-preferred configuration.
-- If there is no client-preferred configuration, jedi language server users "plaintext".
-- markupKindPreferred = "markdown",
workspace = {
symbols = {
-- Performance optimization that sets names of folders that are ignored for workspace/symbols.
-- type: string[]
-- default: { ".nox", ".tox", ".venv", "__pycache__", "venv" }
-- If you manually set this option, it overrides the default.
-- Setting it to an empty array will result in no ignored folders.
ignoreFolders = {
".nox", ".tox", ".venv", "__pycache__", "venv",
"artifacts", "config", ".vscode", ".pytest_cache",
"build", "scripts", "incoax_tests.egg-info",
"node_modules",
},
},
},
},
},
}
@@ -15,18 +15,28 @@
]] ]]
return { return {
cmd = { "lemminx", }, enabled = true,
single_file_support = true, lspconfig = {
init_options = { filetypes = {
settings = { "xml",
xml = { "xsd",
format = { "xsl",
splitAttributes = true, "xslt",
joinCDATALines = false, "svg",
joinContentLines = true, },
joinCommentLines = false, cmd = { "lemminx", },
spaceBeforeEmptyCloseLine = false, single_file_support = true,
enabled = true, init_options = {
settings = {
xml = {
format = {
splitAttributes = true,
joinCDATALines = false,
joinContentLines = true,
joinCommentLines = false,
spaceBeforeEmptyCloseLine = false,
enabled = true,
},
}, },
}, },
}, },
@@ -21,19 +21,25 @@ table.insert(runtime_path, "lua/?/init.lua")
-- spec: https://luals.github.io/wiki/settings/ -- spec: https://luals.github.io/wiki/settings/
return { return {
cmd = { "lua-language-server", }, enabled = true,
single_file_support = true, lspconfig = {
settings = { filetypes = {
Lua = { "lua",
runtime = { },
version = "LuaJIT", cmd = { "lua-language-server", },
path = runtime_path, single_file_support = true,
settings = {
Lua = {
runtime = {
version = "LuaJIT",
path = runtime_path,
},
workspace = {
library = vim.api.nvim_get_runtime_file("", true),
checkThirdParty = false,
},
telemetry = { enable = false, },
}, },
workspace = {
library = vim.api.nvim_get_runtime_file("", true),
checkThirdParty = false,
},
telemetry = { enable = false, },
}, },
}, },
} }