158 lines
4.8 KiB
Lua
158 lines
4.8 KiB
Lua
if vim.fn.has('nvim-0.5.1') == 1 then
|
|
require('vim.lsp.log').set_format_func(vim.inspect)
|
|
end
|
|
|
|
vim.lsp.set_log_level("off")
|
|
|
|
require("config.lsp.pyright")
|
|
-- require("config.lsp.pylsp")
|
|
-- require("config.lsp.typescript")
|
|
require("config.lsp.clangd")
|
|
require("config.lsp.vls")
|
|
|
|
local api = vim.api
|
|
local keymap = vim.keymap.set
|
|
|
|
local function keymappings(_, bufnr)
|
|
local opts = { noremap = true, silent = true }
|
|
|
|
keymap("n", "K", vim.lsp.buf.hover, { buffer = bufnr })
|
|
keymap("n", "[d", "<cmd>lua vim.diagnostic.goto_prev()<CR>", opts)
|
|
keymap("n", "]d", "<cmd>lua vim.diagnostic.goto_next()<CR>", opts)
|
|
keymap("n", "[e", "<cmd>lua vim.diagnostic.goto_prev({severity = vim.diagnostic.severity.ERROR})<CR>", opts)
|
|
keymap("n", "]e", "<cmd>lua vim.diagnostic.goto_next({severity = vim.diagnostic.severity.ERROR})<CR>", opts)
|
|
|
|
keymap("n", "gd", "<Cmd>lua vim.lsp.buf.definition()<CR>", opts)
|
|
keymap("n", "gD", "<Cmd>lua vim.lsp.buf.declaration()<CR>", opts)
|
|
keymap("n", "gh", "<cmd>lua vim.lsp.buf.signature_help()<CR>", opts)
|
|
keymap("n", "gI", "<cmd>lua vim.lsp.buf.implementation()<CR>", opts)
|
|
keymap("n", "gb", "<cmd>lua vim.lsp.buf.type_definition()<CR>", opts)
|
|
|
|
keymap("n", "gl", "<cmd>lua vim.diagnostic.reset()<CR>", opts)
|
|
|
|
-- api.nvim_set_keymap("i", "<Tab>", [[pumvisible() ? "\<C-n>" : "\<Tab>"]], { noremap = true, expr = true })
|
|
-- api.nvim_set_keymap("i", "<S-Tab>", [[pumvisible() ? "\<C-p>" : "\<S-Tab>"]], { noremap = true, expr = true })
|
|
end
|
|
|
|
local function highlighting(client, bufnr)
|
|
if client.server_capabilities.documentHighlightProvider then
|
|
local lsp_highlight_grp = api.nvim_create_augroup("LspDocumentHighlight", { clear = true })
|
|
api.nvim_create_autocmd("CursorHold", {
|
|
callback = function()
|
|
vim.schedule(vim.lsp.buf.document_highlight)
|
|
end,
|
|
group = lsp_highlight_grp,
|
|
buffer = bufnr,
|
|
})
|
|
api.nvim_create_autocmd("CursorMoved", {
|
|
callback = function()
|
|
vim.schedule(vim.lsp.buf.clear_references)
|
|
end,
|
|
group = lsp_highlight_grp,
|
|
buffer = bufnr,
|
|
})
|
|
end
|
|
end
|
|
|
|
local function lsp_handlers()
|
|
local diagnostics = {
|
|
Error = "E:",
|
|
Warning = "W:",
|
|
Hint = "",
|
|
Information = "I:",
|
|
Question = "Q:",
|
|
}
|
|
local signs = {
|
|
{ name = "DiagnosticSignError", text = diagnostics.Error },
|
|
{ name = "DiagnosticSignWarn", text = diagnostics.Warning },
|
|
{ name = "DiagnosticSignHint", text = diagnostics.Hint },
|
|
{ name = "DiagnosticSignInfo", text = diagnostics.Info },
|
|
}
|
|
for _, sign in ipairs(signs) do
|
|
vim.fn.sign_define(sign.name, { texthl = sign.name, text = sign.text, numhl = sign.name })
|
|
end
|
|
|
|
-- LSP handlers configuration
|
|
local config = {
|
|
float = {
|
|
focusable = true,
|
|
style = "minimal",
|
|
border = "rounded",
|
|
},
|
|
|
|
diagnostic = {
|
|
virtual_text = { severity = vim.diagnostic.severity.ERROR },
|
|
signs = {
|
|
active = signs,
|
|
},
|
|
underline = true,
|
|
update_in_insert = false,
|
|
severity_sort = true,
|
|
float = {
|
|
focusable = true,
|
|
style = "minimal",
|
|
border = "rounded",
|
|
source = "always",
|
|
header = "",
|
|
prefix = "",
|
|
},
|
|
},
|
|
}
|
|
|
|
vim.diagnostic.config(config.diagnostic)
|
|
vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, config.float)
|
|
vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, config.float)
|
|
end
|
|
|
|
local function formatting(client, bufnr)
|
|
if client.server_capabilities.documentFormattingProvider then
|
|
local function format()
|
|
local view = vim.fn.winsaveview()
|
|
vim.lsp.buf.format({
|
|
async = true,
|
|
filter = function(attached_client)
|
|
return attached_client.name ~= ""
|
|
end,
|
|
})
|
|
vim.fn.winrestview(view)
|
|
end
|
|
|
|
local lsp_format_grp = api.nvim_create_augroup("LspFormat", { clear = true })
|
|
api.nvim_create_autocmd("BufWritePre", {
|
|
callback = function()
|
|
vim.schedule(format)
|
|
end,
|
|
group = lsp_format_grp,
|
|
buffer = bufnr,
|
|
})
|
|
end
|
|
end
|
|
|
|
local function on_attach(client, bufnr)
|
|
if client.server_capabilities.completionProvider then
|
|
vim.bo[bufnr].omnifunc = "v:lua.vim.lsp.omnifunc"
|
|
vim.bo[bufnr].completefunc = "v:lua.vim.lsp.omnifunc"
|
|
end
|
|
|
|
if client.server_capabilities.definitionProvider then
|
|
vim.bo[bufnr].tagfunc = "v:lua.vim.lsp.tagfunc"
|
|
end
|
|
|
|
if client.server_capabilities.documentFormattingProvider then
|
|
vim.bo[bufnr].formatexpr = "v:lua.vim.lsp.formatexpr()"
|
|
end
|
|
|
|
keymappings(client, bufnr)
|
|
--highlighting(client, bufnr)
|
|
--formatting(client, bufnr)
|
|
end
|
|
|
|
lsp_handlers()
|
|
|
|
vim.api.nvim_create_autocmd("LspAttach", {
|
|
callback = function(args)
|
|
local bufnr = args.buf
|
|
local client = vim.lsp.get_client_by_id(args.data.client_id)
|
|
on_attach(client, bufnr)
|
|
end,
|
|
})
|