nvim: Refactor lsp, linting and outliners away from ide

Start splitting up ide plugin module by splitting out individual
modules.
This commit is contained in:
Marty Oehme 2024-07-30 14:37:20 +02:00
parent 95de192924
commit 2ddf69c244
Signed by: Marty
GPG key ID: EDBF2ED917B2EF6A
4 changed files with 447 additions and 124 deletions

View file

@ -1,15 +1,3 @@
local linters = {
astro = { "eslint_d" },
bash = { "shellcheck" },
javascript = { "eslint_d" },
javascriptreact = { "eslint_d" },
markdown = { "markdownlint" },
quarto = { "markdownlint" },
sh = { "shellcheck" },
svelte = { "eslint_d" },
text = {},
typescript = { "eslint_d" },
typescriptreact = { "eslint_d" },
} }
local formatters = { local formatters = {
angular = { { "prettierd", "prettier" } }, angular = { { "prettierd", "prettier" } },
@ -36,102 +24,8 @@ local formatters = {
} }
return { return {
-- vista-like outline view for code
{
"stevearc/aerial.nvim",
config = true,
-- Optional dependencies
dependencies = {
"nvim-treesitter/nvim-treesitter",
"nvim-tree/nvim-web-devicons",
},
cmd = {
"AerialToggle",
"AerialOpen",
"AerialOpenAll",
"AerialClose",
"AerialCloseAll",
"AerialNext",
"AerialPrev",
"AerialGo",
"AerialInfo",
"AerialNavToggle",
"AerialNavOpen",
"AerialNavClose",
},
opts = {
backends = { "treesitter", "lsp", "markdown", "man" },
},
keys = {
{ "<leader>so", "<cmd>AerialNavToggle<cr>", silent = true, desc = "symbol navigator" },
{ "<leader>sO", "<cmd>AerialToggle<cr>", silent = true, desc = "symbol outline" },
},
},
-- lsp setup
{
"junnplus/lsp-setup.nvim",
dependencies = {
{
"neovim/nvim-lspconfig",
-- will sometimes not keep up with lsp changes if set to stable
version = false,
},
{
"williamboman/mason.nvim",
cmd = {
"Mason",
"MasonInstall",
"MasonUninstall",
"MasonUninstallAll",
"MasonLog",
"MasonUpdate",
},
build = ":MasonUpdate",
keys = {
{ "<leader>vm", ":Mason<cr>", desc = "Mason" },
},
},
{
"williamboman/mason-lspconfig.nvim",
cmd = { "LspInstall", "LspUninstall" },
},
},
event = { "BufReadPost", "BufNewFile", "BufWritePre" },
config = function()
require("plugins.config.lsp")
end,
keys = { { "<leader>vs", ":LspInfo<cr>", desc = "LspInfo" } },
},
-- pretty lsp 'peek' menus
{
"DNLHC/glance.nvim",
opts = { border = { enable = true }, theme = { enable = true, mode = "auto" } },
cmd = { "Glance" },
},
-- linting setup
{
"rshkarin/mason-nvim-lint",
dependencies = {
{
"mfussenegger/nvim-lint",
config = function()
require("lint").linters_by_ft = linters
vim.api.nvim_create_autocmd({ "BufWritePost", "InsertLeave" }, {
callback = function()
if not vim.g.disable_autolint then
require("lint").try_lint()
end
end,
})
end,
dependencies = { "williamboman/mason.nvim" },
},
},
event = { "BufReadPost", "BufNewFile", "BufWritePre" },
opts = {},
},
-- formatting setup -- formatting setup
{ {
@ -177,6 +71,7 @@ return {
function() function()
require("conform").format({ async = true, lsp_fallback = true }) require("conform").format({ async = true, lsp_fallback = true })
end, end,
mode = { "n", "v" },
desc = "Format buffer", desc = "Format buffer",
}, },
{ {
@ -202,24 +97,6 @@ return {
opts = {}, opts = {},
}, },
-- useful quickfix-like buffer
{
"folke/trouble.nvim",
dependencies = { "nvim-tree/nvim-web-devicons" },
opts = {},
cmd = {
"Trouble",
},
keys = {
{ "<leader>sd", "<cmd>Trouble diagnostics toggle<cr>", silent = true, desc = "diagnostics workspace" },
{
"<leader>sD",
"<cmd>Trouble diagnostics toggle filter.buf=0<cr>",
silent = true,
desc = "diagnostics document",
},
},
},
-- automatic docstring creation for a variety of languages -- automatic docstring creation for a variety of languages
{ {

View file

@ -0,0 +1,38 @@
local linters = {
astro = { "eslint_d" },
bash = { "shellcheck" },
javascript = { "eslint_d" },
javascriptreact = { "eslint_d" },
markdown = { "markdownlint" },
quarto = { "markdownlint" },
sh = { "shellcheck" },
svelte = { "eslint_d" },
text = {},
typescript = { "eslint_d" },
typescriptreact = { "eslint_d" },
}
return {
-- linting setup
{
"rshkarin/mason-nvim-lint",
dependencies = {
{
"mfussenegger/nvim-lint",
config = function()
require("lint").linters_by_ft = linters
vim.api.nvim_create_autocmd({ "BufWritePost", "InsertLeave" }, {
callback = function()
if not vim.g.disable_autolint then
require("lint").try_lint()
end
end,
})
end,
dependencies = { "williamboman/mason.nvim" },
},
},
event = { "BufReadPost", "BufNewFile", "BufWritePre" },
opts = {},
},
}

View file

@ -0,0 +1,357 @@
local servers = {
ansiblels = {},
arduino_language_server = {},
astro = {},
bashls = {},
beancount = {},
clangd = {},
cssls = {},
docker_compose_language_service = {},
dockerls = {},
emmet_ls = {},
eslint = {},
gopls = {},
harper_ls = {},
julials = {},
jsonls = {},
ltex = { autostart = false },
lua_ls = {
settings = {
Lua = {
diagnostics = { globals = { "vim" } },
-- enable when working on neovim stuff. Takes *long* to load
-- workspace = { library = vim.api.nvim_get_runtime_file("", true) },
telemetry = { enable = false },
hint = {
enable = true,
setType = true,
},
},
},
},
marksman = {},
basedpyright = {},
ruff = {},
serve_d = {},
taplo = {},
texlab = {},
tsserver = {},
yamlls = {},
}
return {
-- lsp setup
{
"junnplus/lsp-setup.nvim",
dependencies = {
{
"neovim/nvim-lspconfig",
-- will sometimes not keep up with lsp changes if set to stable
version = false,
},
{
"williamboman/mason.nvim",
cmd = {
"Mason",
"MasonInstall",
"MasonUninstall",
"MasonUninstallAll",
"MasonLog",
"MasonUpdate",
},
build = ":MasonUpdate",
keys = {
{ "<leader>vm", ":Mason<cr>", desc = "Mason" },
},
},
{
"williamboman/mason-lspconfig.nvim",
cmd = { "LspInstall", "LspUninstall" },
},
},
event = { "BufReadPost", "BufNewFile", "BufWritePre" },
config = function()
vim.diagnostic.config({ virtual_text = true })
vim.fn.sign_define("DiagnosticSignError", { text = "", texthl = "DiagnosticSignError" })
vim.fn.sign_define("DiagnosticSignWarn", { text = "", texthl = "DiagnosticSignWarn" })
vim.fn.sign_define("DiagnosticSignInfo", { text = "", texthl = "DiagnosticSignInfo" })
vim.fn.sign_define("DiagnosticSignHint", { text = "", texthl = "DiagnosticSignHint" })
local lsp = require("lsp-setup")
local function on_attach(_, bufnr)
local map = vim.keymap.set
map(
"n",
"[d",
"<cmd>lua vim.diagnostic.goto_prev()<cr>",
{ buffer = bufnr, desc = "Previous diagnostic" }
)
map("n", "]d", "<cmd>lua vim.diagnostic.goto_next()<cr>", { buffer = bufnr, desc = "Next diagnostic" })
map(
"n",
"[D",
"<cmd>lua vim.diagnostic.goto_prev({severity = vim.diagnostic.severity.ERROR})<cr>",
{ buffer = bufnr, desc = "Previous error" }
)
map(
"n",
"]D",
"<cmd>lua vim.diagnostic.goto_next({severity = vim.diagnostic.severity.ERROR})<cr>",
{ buffer = bufnr, desc = "Next error" }
)
if require("core.util").is_available("which-key") then
require("which-key").add({ "<localleader>l", group = "language" })
end
map(
"n",
"<localleader>ld",
"<cmd>lua vim.diagnostic.open_float()<cr>",
{ buffer = bufnr, desc = "Line diagnostics" }
)
map("n", "<localleader>li", function()
vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled())
end, { buffer = bufnr, desc = "Inlay hints" })
map(
"n",
"<localleader>la",
"<cmd>lua vim.lsp.buf.code_action()<cr>",
{ buffer = bufnr, desc = "Codeactions" }
)
map(
"n",
"<localleader>ln",
"<cmd>lua vim.lsp.buf.rename()<cr>",
{ buffer = bufnr, desc = "Rename element" }
)
if vim.fn.exists(":Glance") then
map("n", "<localleader>lr", "<cmd>Glance references<cr>", { buffer = bufnr, desc = "References" })
map("n", "<localleader>lf", "<cmd>Glance definitions<cr>", { buffer = bufnr, desc = "Definition" })
map(
"n",
"<localleader>lt",
"<cmd>Glance type_definitions<cr>",
{ buffer = bufnr, desc = "Type definition" }
)
map(
"n",
"<localleader>lm",
"<cmd>Glance implementations<cr>",
{ buffer = bufnr, desc = "Implementation" }
)
elseif vim.fn.exists(":Telescope") then
map(
"n",
"<localleader>lr",
"<cmd>Telescope lsp_references<cr>",
{ buffer = bufnr, desc = "References" }
)
map(
"n",
"<localleader>lf",
"<cmd>Telescope lsp_definitions<cr>",
{ buffer = bufnr, desc = "Definition" }
)
map(
"n",
"<localleader>lt",
"<cmd>Telescope lsp_type_definitions<cr>",
{ buffer = bufnr, desc = "Type definition" }
)
map(
"n",
"<localleader>lm",
"<cmd>Telescope lsp_implementations<cr>",
{ buffer = bufnr, desc = "Implementation" }
)
else
map(
"n",
"<localleader>lr",
"<cmd>lua vim.lsp.buf.references()<cr>",
{ buffer = bufnr, desc = "References" }
)
map(
"n",
"<localleader>lf",
"<cmd>lua vim.lsp.buf.definition()<cr>",
{ buffer = bufnr, desc = "Definition" }
)
map(
"n",
"<localleader>lt",
"<cmd>lua vim.lsp.buf.type_definition()<cr>",
{ buffer = bufnr, desc = "Type definition" }
)
map(
"n",
"<localleader>lm",
"<cmd>lua vim.lsp.buf.implementation()<cr>",
{ buffer = bufnr, desc = "Implementation" }
)
end
map("n", "K", "<cmd>lua vim.lsp.buf.hover()<cr>", { buffer = bufnr, desc = "Hover definition" })
map(
"n",
"<localleader>lc",
"<cmd>lua vim.lsp.buf.declaration()<cr>",
{ buffer = bufnr, desc = "Declaration" }
)
map(
"n",
"<localleader>ls",
"<cmd>lua vim.lsp.buf.signature_help()<cr>",
{ buffer = bufnr, desc = "Signature help" }
)
map("n", "<localleader>lo", function()
if vim.diagnostic.is_disabled(0) then
vim.diagnostic.enable(0)
else
vim.diagnostic.disable(0)
end
end, { buffer = bufnr, desc = "Toggle Diagnostics" })
end
-- Display diagnostics as virtual text only if not in insert mode
-- /r/neovim/comments/12inp4c/disable_diagnostics_virtual_text_when_in_insert/jqqifwk/
vim.api.nvim_create_autocmd("InsertEnter", {
callback = function()
vim.diagnostic.config({ virtual_text = false })
end,
})
vim.api.nvim_create_autocmd("InsertLeave", {
callback = function()
vim.diagnostic.config({ virtual_text = true })
end,
})
lsp.setup({
default_mappings = false,
servers = servers,
on_attach = on_attach,
inlay_hints = {
enabled = vim.fn.has("nvim-0.10") == true and true or false,
},
})
local lspconfig = require("lspconfig")
lspconfig.nushell.setup({})
lspconfig.marksman.setup({
filetypes = { "markdown", "quarto" },
on_attach = function(client, bufnr)
-- TODO: for some reason this stays true even after rootdir switch?
if client.config.in_zk_notebook then
vim.defer_fn(function()
vim.lsp.buf_detach_client(bufnr, client.id)
end, 1000)
end
on_attach(client, bufnr)
end,
on_new_config = function(conf, new_root)
if require("lspconfig.util").root_pattern(".zk")(new_root) then
conf.in_zk_notebook = true
else
conf.in_zk_notebook = false
end
end,
})
lspconfig.harper_ls.setup({
filetypes = { -- standard filetypes plus quarto
"c",
"cpp",
"csharp",
"gitcommit",
"go",
"html",
"java",
"javascript",
"lua",
"markdown",
"python",
"quarto",
"ruby",
"rust",
"swift",
"toml",
"typescript",
"typescriptreact",
},
})
local python_path
-- ensure python virtualenv is determined automatically on lsp start
lspconfig.basedpyright.setup({
on_attach = function(client, bufnr)
on_attach(client, bufnr)
require("core.util").set_python_env()
if python_path == nil then
python_path, _ = vim.fn.expand(require("core.util").get_python_venv_bin(client.config.root_dir))
end
-- print(string.format("[PYTHON VENV]: %s", vim.inspect(python_path)))
client.config.settings.python = {} or client.config.settings.python
client.config.settings.python.pythonPath = python_path
end,
settings = {
-- disable imports and linting since, we use ruff for that
pyright = {
disableOrganizeImports = true,
},
python = {
analysis = {
ignore = { "*" },
},
},
},
})
lspconfig.ruff.setup({
on_attach = function(client, bufnr)
on_attach(client, bufnr)
require("core.util").set_python_env()
client.server_capabilities.hoverProvider = false -- we use pyright for hover info
if python_path == nil then
python_path, _ = vim.fn.expand(require("core.util").get_python_venv_bin(client.config.root_dir))
end
client.config.settings.python = {} or client.config.settings.python
client.config.settings.python.pythonPath = python_path
end,
})
-- set up arduino with the help of arduino.nvim plugin
if require("core.util").is_available("arduino") then
lspconfig.arduino_language_server.setup({
on_new_config = require("arduino").on_new_config,
})
end
-- attach ltex for fitting ft only when spell checking becomes enabled
vim.api.nvim_create_autocmd("User", {
pattern = "SpellEnable",
callback = function()
lspconfig.ltex.setup({
on_attach = function(client, bufnr)
on_attach(client, bufnr)
if require("core.util").is_available("ltex_extra") then
require("ltex_extra").setup()
end
end,
settings = {
ltex = {
language = vim.opt.spelllang:get(),
},
},
})
vim.cmd("LspStart ltex")
end,
})
end,
keys = { { "<leader>vs", ":LspInfo<cr>", desc = "LspInfo" } },
},
-- pretty lsp 'peek' menus
{
"DNLHC/glance.nvim",
opts = { border = { enable = true }, theme = { enable = true, mode = "auto" } },
cmd = { "Glance" },
},
}

View file

@ -0,0 +1,51 @@
return {
-- vista-like outline view for code
{
"stevearc/aerial.nvim",
config = true,
-- Optional dependencies
dependencies = {
"nvim-treesitter/nvim-treesitter",
"nvim-tree/nvim-web-devicons",
},
cmd = {
"AerialToggle",
"AerialOpen",
"AerialOpenAll",
"AerialClose",
"AerialCloseAll",
"AerialNext",
"AerialPrev",
"AerialGo",
"AerialInfo",
"AerialNavToggle",
"AerialNavOpen",
"AerialNavClose",
},
opts = {
backends = { "treesitter", "lsp", "markdown", "man" },
},
keys = {
{ "<leader>so", "<cmd>AerialNavToggle<cr>", silent = true, desc = "symbol navigator" },
{ "<leader>sO", "<cmd>AerialToggle<cr>", silent = true, desc = "symbol outline" },
},
},
-- useful quickfix-like buffer
{
"folke/trouble.nvim",
dependencies = { "nvim-tree/nvim-web-devicons" },
opts = {},
cmd = {
"Trouble",
},
keys = {
{ "<leader>sd", "<cmd>Trouble diagnostics toggle<cr>", silent = true, desc = "diagnostics workspace" },
{
"<leader>sD",
"<cmd>Trouble diagnostics toggle filter.buf=0<cr>",
silent = true,
desc = "diagnostics document",
},
},
},
}