diff --git a/.config/nvim/lua/config/lsp/init.lua b/.config/nvim/lua/config/lsp/init.lua new file mode 100644 index 0000000..984c87a --- /dev/null +++ b/.config/nvim/lua/config/lsp/init.lua @@ -0,0 +1,52 @@ +local M = {} + +local servers = { + gopls = {}, + html = {}, + jsonls = {}, + pyright = {}, + tsserver = {}, + vimls = {}, + dartls = {}, + dockerls = {}, + intelephense = {}, + sqlls = {}, + volar = {}, +} + +local function on_attach(client, bufnr) + -- Enable completion triggered by + -- See `:help omnifunc` and `:help ins-completion` for more information. + vim.api.nvim_buf_set_option(bufnr, "omnifunc", "v:lua.vim.lsp.omnifunc") + + -- Use LSP as the handler for formatexpr. + -- See `:help formatexpr` for more information. + vim.api.nvim_buf_set_option(0, "formatexpr", "v:lua.vim.lsp.formatexpr()") + + -- Configure key mappings + require("config.lsp.keymaps").setup(client, bufnr) +end + +local lsp_signature = require "lsp_signature" +lsp_signature.setup { + bind = true, + handler_opts = { + border = "rounded", + }, +} + +local capabilities = require("cmp_nvim_lsp").update_capabilities(vim.lsp.protocol.make_client_capabilities()) + +local opts = { + on_attach = on_attach, + capabilities = cababilities, + flags = { + debounce_text_changes = 150, + }, +} + +function M.setup() + require("config.lsp.installer").setup(servers, opts) +end + +return M diff --git a/.config/nvim/lua/config/lsp/installer.lua b/.config/nvim/lua/config/lsp/installer.lua new file mode 100644 index 0000000..012eb69 --- /dev/null +++ b/.config/nvim/lua/config/lsp/installer.lua @@ -0,0 +1,26 @@ +local lsp_installer_servers = require "nvim-lsp-installer.servers" +local utils = require "utils" + +local M = {} + +function M.setup(servers, options) + for server_name, _ in pairs(servers) do + local server_available, server = lsp_installer_servers.get_server(server_name) + + if server_available then + server:on_ready(function() + local opts = vim.tbl_deep_extend("force", options, servers[server.name] or {}) + server:setup(opts) + end) + + if not server:is_installed() then + utils.info("Installing " .. server.name) + server:install() + end + else + utils.error(server) + end + end +end + +return M diff --git a/.config/nvim/lua/config/lsp/keymaps.lua b/.config/nvim/lua/config/lsp/keymaps.lua new file mode 100644 index 0000000..f33d9b1 --- /dev/null +++ b/.config/nvim/lua/config/lsp/keymaps.lua @@ -0,0 +1,36 @@ +local M = {} + +local keymap = vim.api.nvim_set_keymap +local buf_keymap = vim.api.nvim_buf_set_keymap + +local function keymappings(client, bufnr) + local opts = { noremap = true, silent = true } + + -- Key mappings + vim.keymap.set("n", "K", vim.lsp.buf.hover, opts) + vim.keymap.set("n", "[d", vim.diagnostic.goto_prev, opts) + vim.keymap.set("n", "]d", vim.diagnostic.goto_next, opts) + vim.keymap.set("n", "[e", function () vim.diagnostic.goto_prev({severity = vim.diagnostic.severity.ERROR}) end, opts) + vim.keymap.set("n", "]e", function () vim.diagnostic.goto_next({severity = vim.diagnostic.severity.ERROR}) end, opts) + + vim.keymap.set("n", "rn", vim.lsp.buf.rename, opts) + vim.keymap.set("n", "K", vim.lsp.buf.code_action, opts) + vim.keymap.set("n", "of", vim.diagnostic.open_float, opts) + + -- if client.resolved_capabilities.document_formatting then + -- vim.keymap.set("n", "ff", vim.lsp.buf.formatting, opts) + -- end + + vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts) + vim.keymap.set("n", "gD", vim.lsp.buf.declaration, opts) + vim.keymap.set("n", "gh", vim.lsp.buf.signature_help, opts) + vim.keymap.set("n", "gi", vim.lsp.buf.implementation, opts) + vim.keymap.set("n", "gT", vim.lsp.buf.type_definition, opts) + +end + +function M.setup(client, bufnr) + keymappings(client, bufnr) +end + +return M