-- setting error signs local function sign_define(args) vim.fn.sign_define(args.name, { texthl = args.name, text = args.text, numhl = "", }) end sign_define({ name = "DiagnosticSignError", text = "E" }) sign_define({ name = "DiagnosticSignWarn", text = "W" }) sign_define({ name = "DiagnosticSignHint", text = "H" }) sign_define({ name = "DiagnosticSignInfo", text = "I" }) -- diagnostic's aren't lsp dependent vim.keymap.set("n", "vd", function() vim.diagnostic.open_float() end) vim.keymap.set("n", "[d", function() vim.diagnostic.goto_next() end) vim.keymap.set("n", "]d", function() vim.diagnostic.goto_prev() end) -- lsp capabilites enabler vim.api.nvim_create_autocmd("LspAttach", { desc = "LSP Actions", callback = function(event) -- Enable omnifunc -- vim.bo[event.buf].omnifunc = "v:lua.vim.lsp.omnifunc" -- Buffer local mappings local opts = { buffer = event.buf } vim.keymap.set("n", "K", function() vim.lsp.buf.hover() end, opts) vim.keymap.set("n", "gd", function() vim.lsp.buf.definition() end, opts) vim.keymap.set("n", "gD", function() vim.lsp.buf.declaration() end, opts) vim.keymap.set("n", "gi", function() vim.lsp.buf.implementation() end, opts) vim.keymap.set("n", "lca", function() vim.lsp.buf.code_action() end, opts) vim.keymap.set("n", "lrn", function() vim.lsp.buf.rename() end, opts) vim.keymap.set("i", "", function() vim.lsp.buf.signature_help() end, opts) end, }) local lsp_capabilities = require("cmp_nvim_lsp").default_capabilities() local default_setup = function(server) require("lspconfig")[server].setup({ capabilities = lsp_capabilities, }) end -- setup mason and automatically install some language server's require("mason").setup({}) require("mason-lspconfig").setup({ ensure_installed = { "lua_ls", "jsonls", "bashls", "pyright", "marksman", "gopls", "clangd" }, handlers = { default_setup }, }) -- setup haskell language server manually cause it doesn't work with mason for xmonad require("lspconfig").hls.setup({ capabilities = lsp_capabilities }) -- simple completion setup with snippet support local cmp = require("cmp") cmp.setup({ sources = { { name = "nvim_lsp" }, { name = "snippy" }, { name = "path" }, }, mapping = cmp.mapping.preset.insert({ [""] = cmp.mapping.confirm({ select = false }), [""] = cmp.mapping(function(fallback) if cmp.visible then cmp.select_next_item() else fallback() end end, { "i", "s" }), [""] = cmp.mapping(function(fallback) if cmp.visible then cmp.select_prev_item() else fallback() end end, { "i", "s" }), }), snippet = { expand = function(args) require("snippy").expand_snippet(args.body) end, }, formatting = { format = require("lspkind").cmp_format({ mode = "symbol_text", -- show only symbol annotations maxwidth = 50, -- prevent the popup from showing more than provided characters ellipsis_char = "...", -- when popup menu exceed maxwidth, the truncated part would show ellipsis_char instead }), }, enabled = function() -- disable completion in comments local context = require("cmp.config.context") return not context.in_treesitter_capture("comment") and not context.in_syntax_group("Comment") end, })