nvim lsp work
This commit is contained in:
+131
-54
@@ -144,53 +144,62 @@ vim.api.nvim_create_autocmd("ColorScheme", {
|
|||||||
-- LSP
|
-- LSP
|
||||||
-- ----------------------------------------
|
-- ----------------------------------------
|
||||||
|
|
||||||
-- vim.lsp.set_log_level(1)
|
local function lspsetup()
|
||||||
vim.api.nvim_create_autocmd("LspAttach", {
|
vim.lsp.set_log_level(2)
|
||||||
group = vim.api.nvim_create_augroup("UserLspAttach", { clear = true }),
|
vim.keymap.set("n", "<leader>ll", "<cmd>e ~/.local/state/nvim/lsp.log<cr>", { noremap = true })
|
||||||
|
local lspgroup = vim.api.nvim_create_augroup("lsp", { clear = true })
|
||||||
|
|
||||||
|
vim.api.nvim_create_autocmd("LspAttach", {
|
||||||
|
group = lspgroup,
|
||||||
callback = function(ev)
|
callback = function(ev)
|
||||||
vim.lsp.completion.enable(true, ev.data.client_id, ev.buf)
|
vim.lsp.completion.enable(true, ev.data.client_id, ev.buf)
|
||||||
local bmap = function(mode, keys, func) vim.keymap.set(mode, keys, func, { buffer = ev.buf, noremap = true }) end
|
|
||||||
local diag = vim.diagnostic
|
local diag = vim.diagnostic
|
||||||
local severity = diag.severity.HINT
|
local severity = diag.severity.HINT
|
||||||
|
local keyspec = {
|
||||||
-- workspaces
|
-- workspaces
|
||||||
bmap("n", "<leader>wa", vim.lsp.buf.add_workspace_folder)
|
{ "<leader>wa", vim.lsp.buf.add_workspace_folder },
|
||||||
bmap("n", "<leader>wr", vim.lsp.buf.remove_workspace_folder)
|
{ "<leader>wr", vim.lsp.buf.remove_workspace_folder },
|
||||||
bmap("n", "<leader>wl", function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end)
|
{ "<leader>wl", function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end },
|
||||||
-- jump
|
-- jump
|
||||||
bmap("n", "<M-i>", function() diag.open_float({ source = true }) end)
|
{ "<M-i>", function() diag.open_float({ source = true }) end },
|
||||||
bmap("n", "<M-n>", function() diag.jump({ severity = { min = severity }, float = true, count = 1 }) end)
|
{ "<M-n>", function() diag.jump({ severity = { min = severity }, float = true, count = 1 }) end },
|
||||||
bmap("n", "<M-p>", function() diag.jump({ severity = { min = severity }, float = true, count = -1 }) end)
|
{ "<M-p>", function() diag.jump({ severity = { min = severity }, float = true, count = -1 }) end },
|
||||||
bmap("n", "gd", vim.lsp.buf.definition)
|
{ "gd", vim.lsp.buf.definition },
|
||||||
bmap("n", "gD", vim.lsp.buf.type_definition)
|
{ "gD", vim.lsp.buf.type_definition },
|
||||||
bmap("n", "gi", vim.lsp.buf.declaration)
|
{ "gi", vim.lsp.buf.declaration },
|
||||||
bmap("n", "gI", vim.lsp.buf.implementation)
|
{ "gI", vim.lsp.buf.implementation },
|
||||||
-- quickfix
|
-- quickfix
|
||||||
bmap("n", "gl", diag.setloclist)
|
{ "gl", diag.setloclist },
|
||||||
bmap("n", "gr", vim.lsp.buf.references)
|
{ "gr", function() vim.lsp.buf.references({ includeDeclaration = false }) end },
|
||||||
-- popups
|
-- popups
|
||||||
bmap({ "n", "i" }, "<M-x>", vim.lsp.buf.signature_help)
|
{ "<M-x>", vim.lsp.buf.signature_help, { "n", "i" } },
|
||||||
|
-- symbols
|
||||||
|
{ "<leader>ds", vim.lsp.buf.document_symbol },
|
||||||
|
{ "<leader>ws", vim.lsp.buf.workspace_symbol },
|
||||||
-- other
|
-- other
|
||||||
bmap("n", "K", vim.lsp.buf.hover)
|
{ "K", vim.lsp.buf.hover },
|
||||||
bmap("n", "<M-r>", vim.lsp.buf.rename)
|
{ "<M-r>", vim.lsp.buf.rename },
|
||||||
bmap("n", "<leader>ca", vim.lsp.buf.code_action)
|
{ "<leader>rn", function() Snacks.rename.rename_file() end },
|
||||||
|
{ "<leader>ca", vim.lsp.buf.code_action, { "n", "x" } },
|
||||||
-- NOTE: Using `assert` bypasses needing to do a nil check before accessing a member that could be nil
|
}
|
||||||
local client = assert(vim.lsp.get_client_by_id(ev.data.client_id))
|
for _, key in ipairs(keyspec) do
|
||||||
|
vim.keymap.set(key[3] or { "n" }, key[1], key[2], { buffer = ev.buf })
|
||||||
|
end
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
vim.api.nvim_create_user_command("LspStop", function(kwargs)
|
vim.api.nvim_create_user_command("LspStop", function(kwargs)
|
||||||
local name = kwargs.fargs[1]
|
local name = kwargs.fargs[1]
|
||||||
for _, client in ipairs(vim.lsp.get_clients({ name = name })) do
|
for _, client in ipairs(vim.lsp.get_clients({ name = name })) do
|
||||||
client:stop()
|
client:stop()
|
||||||
end
|
end
|
||||||
end, {
|
end, {
|
||||||
nargs = "?",
|
nargs = "?",
|
||||||
complete = function()
|
complete = function()
|
||||||
return vim.tbl_map(function(c) return c.name end, vim.lsp.get_clients())
|
return vim.tbl_map(function(c) return c.name end, vim.lsp.get_clients())
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
vim.api.nvim_create_user_command("LspRestart", function(kwargs)
|
vim.api.nvim_create_user_command("LspRestart", function(kwargs)
|
||||||
local name = kwargs.fargs[1]
|
local name = kwargs.fargs[1]
|
||||||
for _, client in ipairs(vim.lsp.get_clients({ name = name })) do
|
for _, client in ipairs(vim.lsp.get_clients({ name = name })) do
|
||||||
local bufs = vim.lsp.get_buffers_by_client_id(client.id)
|
local bufs = vim.lsp.get_buffers_by_client_id(client.id)
|
||||||
@@ -203,15 +212,70 @@ vim.api.nvim_create_user_command("LspRestart", function(kwargs)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end, {
|
end, {
|
||||||
nargs = "?",
|
nargs = "?",
|
||||||
complete = function()
|
complete = function()
|
||||||
return vim.tbl_map(function(c) return c.name end, vim.lsp.get_clients())
|
return vim.tbl_map(function(c) return c.name end, vim.lsp.get_clients())
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
vim.api.nvim_create_autocmd("LspProgress", {
|
||||||
|
group = lspgroup,
|
||||||
|
callback = function(args)
|
||||||
|
local function is_blocking()
|
||||||
|
local mode = vim.api.nvim_get_mode()
|
||||||
|
for _, m in ipairs({ "ic", "ix", "c", "no", "r%?", "rm" }) do
|
||||||
|
if mode.mode:find(m) == 1 then return true end
|
||||||
|
end
|
||||||
|
return mode.blocking
|
||||||
|
end
|
||||||
|
local update_delay_ms = 300
|
||||||
|
local last_update = 0
|
||||||
|
local current_time = vim.uv.now()
|
||||||
|
if is_blocking() or (current_time - last_update) < update_delay_ms then return end
|
||||||
|
last_update = current_time
|
||||||
|
|
||||||
vim.lsp.config("*", { root_markers = { ".git" } })
|
local client = vim.lsp.get_client_by_id(args.data.client_id)
|
||||||
vim.lsp.config["lua_ls"] = {
|
local value = args.data.params.value --[[@as {percentage?: number, title?: string, message?: string, kind: "begin"|"report"|"end"}]]
|
||||||
|
if not client or type(value) ~= "table" then return end
|
||||||
|
local progress = vim.defaulttable()
|
||||||
|
local p = progress[client.id]
|
||||||
|
|
||||||
|
for i = 1, #p + 1 do
|
||||||
|
if i == #p + 1 or p[i].token == args.data.params.token then
|
||||||
|
p[1] = {
|
||||||
|
token = args.data.params.token,
|
||||||
|
msg = ("[%3d%%] %s%s"):format(
|
||||||
|
value.kind == "end" and 100 or value.percentage or 100,
|
||||||
|
value.title or "",
|
||||||
|
value.message and (" **%s**"):format(value.message) or ""
|
||||||
|
),
|
||||||
|
done = value.kind == "end",
|
||||||
|
}
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local msg = {} ---@type string[]
|
||||||
|
progress[client.id] = vim.tbl_filter(function(v) return table.insert(msg, v.msg) or not v.done end, p)
|
||||||
|
|
||||||
|
local spinner = { "⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏" }
|
||||||
|
vim.notify(table.concat(msg, "\n"), "info", {
|
||||||
|
id = "lsp_progress",
|
||||||
|
title = client.name,
|
||||||
|
timeout = 1200,
|
||||||
|
level = 5000,
|
||||||
|
width = { min = 50, max = 50 },
|
||||||
|
opts = function(notif)
|
||||||
|
---@diagnostic disable-next-line: missing-fields
|
||||||
|
notif.icon = #progress[client.id] == 0 and " "
|
||||||
|
or spinner[math.floor(vim.uv.hrtime() / (1e6 * 80)) % #spinner + 1]
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
vim.lsp.config("*", { root_markers = { ".git" } })
|
||||||
|
vim.lsp.config["lua_ls"] = {
|
||||||
cmd = { "lua-language-server" },
|
cmd = { "lua-language-server" },
|
||||||
filetypes = { "lua" },
|
filetypes = { "lua" },
|
||||||
root_markers = {
|
root_markers = {
|
||||||
@@ -233,9 +297,9 @@ vim.lsp.config["lua_ls"] = {
|
|||||||
runtime = { version = "LuaJIT" },
|
runtime = { version = "LuaJIT" },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
vim.lsp.enable("lua_ls")
|
vim.lsp.enable("lua_ls")
|
||||||
vim.lsp.config["basedpyright"] = {
|
vim.lsp.config["basedpyright"] = {
|
||||||
cmd = { "basedpyright-langserver", "--stdio" },
|
cmd = { "basedpyright-langserver", "--stdio" },
|
||||||
filetypes = { "python" },
|
filetypes = { "python" },
|
||||||
root_markers = {
|
root_markers = {
|
||||||
@@ -248,12 +312,16 @@ vim.lsp.config["basedpyright"] = {
|
|||||||
},
|
},
|
||||||
settings = {
|
settings = {
|
||||||
python = {
|
python = {
|
||||||
analysis = { autoImportCompletions = false, diagnosticMode = "workspace", useLibraryCodeForTypes = false },
|
analysis = {
|
||||||
|
autoImportCompletions = false,
|
||||||
|
diagnosticMode = "openFilesOnly",
|
||||||
|
useLibraryCodeForTypes = false,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
vim.lsp.enable("basedpyright")
|
}
|
||||||
vim.lsp.config["html"] = {
|
vim.lsp.enable("basedpyright")
|
||||||
|
vim.lsp.config["html"] = {
|
||||||
cmd = { "vscode-html-language-server", "--stdio" },
|
cmd = { "vscode-html-language-server", "--stdio" },
|
||||||
filetypes = { "html" },
|
filetypes = { "html" },
|
||||||
settings = {
|
settings = {
|
||||||
@@ -269,9 +337,9 @@ vim.lsp.config["html"] = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
vim.lsp.enable("html")
|
vim.lsp.enable("html")
|
||||||
vim.lsp.config["yaml"] = {
|
vim.lsp.config["yaml"] = {
|
||||||
cmd = { "yaml-language-server", "--stdio" },
|
cmd = { "yaml-language-server", "--stdio" },
|
||||||
filetypes = { "yaml" },
|
filetypes = { "yaml" },
|
||||||
settings = {
|
settings = {
|
||||||
@@ -280,23 +348,30 @@ vim.lsp.config["yaml"] = {
|
|||||||
-- schemaStore = { enable = false, url = "" },
|
-- schemaStore = { enable = false, url = "" },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
vim.lsp.enable("yaml")
|
vim.lsp.enable("yaml")
|
||||||
vim.lsp.config["typst"] = {
|
vim.lsp.config["typst"] = {
|
||||||
cmd = { "tinymist" },
|
cmd = { "tinymist" },
|
||||||
filetypes = { "typst" },
|
filetypes = { "typst" },
|
||||||
settings = {},
|
settings = {},
|
||||||
}
|
}
|
||||||
vim.lsp.enable("typst")
|
vim.lsp.enable("typst")
|
||||||
vim.lsp.config["bash"] = {
|
vim.lsp.config["bash"] = {
|
||||||
cmd = { "bash-language-server", "start" },
|
cmd = { "bash-language-server", "start" },
|
||||||
filetypes = { "bash", "sh" },
|
filetypes = { "bash", "sh" },
|
||||||
}
|
}
|
||||||
vim.lsp.enable("bash")
|
vim.lsp.enable("bash")
|
||||||
vim.lsp.config["js"] = {
|
vim.lsp.config["js"] = {
|
||||||
cmd = { "vtsls", "--stdio" },
|
cmd = { "vtsls", "--stdio" },
|
||||||
root_markers = { ".git", "package.json", "tsconfig.json", "jsconfig.json" },
|
root_markers = { ".git", "package.json", "tsconfig.json", "jsconfig.json" },
|
||||||
filetypes = { "javascript", "javascriptreact", "javascript.jsx", "typescript", "typescriptreact", "typescript.tsx" },
|
filetypes = {
|
||||||
|
"javascript",
|
||||||
|
"javascriptreact",
|
||||||
|
"javascript.jsx",
|
||||||
|
"typescript",
|
||||||
|
"typescriptreact",
|
||||||
|
"typescript.tsx",
|
||||||
|
},
|
||||||
settings = {
|
settings = {
|
||||||
complete_function_calls = true,
|
complete_function_calls = true,
|
||||||
vtsls = {
|
vtsls = {
|
||||||
@@ -338,8 +413,10 @@ vim.lsp.config["js"] = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
vim.lsp.enable("js")
|
vim.lsp.enable("js")
|
||||||
|
end
|
||||||
|
lspsetup()
|
||||||
|
|
||||||
-- ----------------------------------------
|
-- ----------------------------------------
|
||||||
-- PLUGINS
|
-- PLUGINS
|
||||||
|
|||||||
Reference in New Issue
Block a user