diff options
Diffstat (limited to 'lua/core/lsp.lua')
-rw-r--r-- | lua/core/lsp.lua | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/lua/core/lsp.lua b/lua/core/lsp.lua new file mode 100644 index 0000000..fd03a42 --- /dev/null +++ b/lua/core/lsp.lua @@ -0,0 +1,84 @@ +---@diagnostic disable: param-type-mismatch + +local misc = require("core.misc") +local map, auto = misc.map, misc.auto +local popup_opts, hover_opts, signature_opts, list_opts, location_opts + +-- TODO: find a way to make the qflist current item be the one closest to the +-- cursor whenever we open it +local function on_list(opts) + vim.fn.setqflist({}, "r", opts) + if #opts.items > 1 then + vim.cmd.copen() + end + vim.cmd(".cc! 1") +end + +-- disable the default keybinds (they're bad) +for _, bind in ipairs({ "grn", "gra", "gri", "grr" }) do + pcall(vim.keymap.del, "n", bind) +end + +local M = {} + +--- setup vim lsp options +function M.setup() + -- options for different lsp functions + popup_opts = { border = vim.g.border_style } + hover_opts = vim.tbl_deep_extend("force", popup_opts, {}) + signature_opts = vim.tbl_deep_extend("force", popup_opts, {}) + list_opts = { on_list = on_list } + location_opts = vim.tbl_deep_extend("force", list_opts, {}) + + -- confgiure lsp + vim.diagnostic.config { + virtual_text = false, + virtual_lines = { + current_line = true + }, + update_in_insert = false, + underline = true, + severity_sort = true, + signs = { + text = { + [vim.diagnostic.severity.ERROR] = "x", + [vim.diagnostic.severity.WARN] = "!", + [vim.diagnostic.severity.INFO] = "i", + [vim.diagnostic.severity.HINT] = "h" + } + } + } + + -- set default capabilities and attach function + vim.lsp.config['*'] = { + capabilities = vim.lsp.protocol.make_client_capabilities() + } + + -- make my attach function always run + auto("LspAttach", { + callback = function(event) + local opts = { buffer = event.buf, nowait = true } + + -- LSP actions + map("n", "K", function() vim.lsp.buf.hover(hover_opts) end, opts) + map("n", "gd", function() vim.lsp.buf.definition(location_opts) end, opts) + map("n", "gD", function() vim.lsp.buf.declaration(location_opts) end, opts) + map("n", "gi", function() vim.lsp.buf.implementation(location_opts) end, opts) + map("n", "gy", function() vim.lsp.buf.type_definition(location_opts) end, opts) + map("n", "gr", function() vim.lsp.buf.references(nil, list_opts) end, opts) + map("n", "<S-Tab>", function() vim.lsp.buf.signature_help(signature_opts) end, opts) + map("n", { "<leader>r", "<F2>" }, vim.lsp.buf.rename, opts) + map("n", { "gA", "<F4>" }, vim.lsp.buf.code_action, opts) + + -- Diagnostics + map("n", "[d", function() + vim.diagnostic.jump({ count = -1 }) + end, opts) + map("n", "]d", function() + vim.diagnostic.jump({ count = 1 }) + end, opts) + end + }) +end + +return M |