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)
local server = self.servers[name]
local ft_map = {}
for _, ft in ipairs(server.filetypes) do
for _, ft in ipairs(server.lspconfig.filetypes) do
ft_map[ft] = true
end
for _, bufnr in ipairs(vim.api.nvim_list_bufs()) do
@@ -241,8 +241,8 @@ function P.filetypes(self)
if not self._filetypes then
self._filetypes = {}
local unique = {}
for _, cfg in pairs(self.servers) do
for _, ft in ipairs(cfg.filetypes) do
for _, server in pairs(self.servers) do
for _, ft in ipairs(server.lspconfig.filetypes) do
if not unique[ft] then
table.insert(self._filetypes, ft)
unique[ft] = true
@@ -257,22 +257,21 @@ end
function P.language_servers(self)
if not self._language_servers then
self._language_servers = {}
for name, opts in pairs(self.servers) do
if opts.dependencies ~= nil then
for _, dep in ipairs(opts.dependencies) do
for name, server in pairs(self.servers) do
if server.dependencies ~= nil then
for _, dep in ipairs(server.dependencies) do
if not utils.is_available(dep) then
utils.warn(
"Disabling " .. name .. " because " .. dep .. " is required but not installed",
module_name
)
opts.enabled = false
server.enabled = false
goto next_server
end
end
end
if opts.enabled == true then
opts.config = require("lsp.config." .. name)
if server.enabled == true then
table.insert(self._language_servers, name)
end
::next_server::
@@ -283,18 +282,17 @@ function P.language_servers(self)
end
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
end
local lspconfig = require("lspconfig")
opts.config.filetypes = opts.filetypes
opts.config.root_dir = lspconfig.util.find_git_ancestor
opts.config.capabilities = self.capabilities
opts.config.on_attach = self.on_attach
lspconfig[name].setup(opts.config)
server.lspconfig.root_dir = lspconfig.util.find_git_ancestor
server.lspconfig.capabilities = self.capabilities
server.lspconfig.on_attach = self.on_attach
lspconfig[name].setup(server.lspconfig)
self:reload_server_buf(name)
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 {
cmd = {
"clangd",
"--clang-tidy",
"--enable-config",
"--log=verbose",
enabled = true,
dependencies = {
"npm",
"shellcheck",
},
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 {
cmd = { "bash-language-server", "start", },
cmd_env = { GLOB_PATTERN = "*@(.sh|.inc|.bash|.command)", },
single_file_support = true,
enabled = true,
lspconfig = {
filetypes = {
"c",
"cpp",
"objc",
"objcpp",
"cuda",
"proto",
},
cmd = {
"clangd",
"--clang-tidy",
"--enable-config",
"--log=verbose",
},
single_file_support = true,
},
}
@@ -15,9 +15,15 @@
]]
return {
cmd = { "cmake-language-server", },
single_file_support = true,
init_options = {
buildDirectory = "build",
enabled = true,
lspconfig = {
filetypes = {
"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 {
cmd = {
"java", "-jar",
"/usr/share/java/groovy-language-server/groovy-language-server-all.jar",
enabled = true,
lspconfig = {
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 {
cmd = { "lemminx", },
single_file_support = true,
init_options = {
settings = {
xml = {
format = {
splitAttributes = true,
joinCDATALines = false,
joinContentLines = true,
joinCommentLines = false,
spaceBeforeEmptyCloseLine = false,
enabled = true,
enabled = true,
lspconfig = {
filetypes = {
"xml",
"xsd",
"xsl",
"xslt",
"svg",
},
cmd = { "lemminx", },
single_file_support = 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/
return {
cmd = { "lua-language-server", },
single_file_support = true,
settings = {
Lua = {
runtime = {
version = "LuaJIT",
path = runtime_path,
enabled = true,
lspconfig = {
filetypes = {
"lua",
},
cmd = { "lua-language-server", },
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, },
},
},
}