return {
    {
        "neovim/nvim-lspconfig",
        -- event = "BufReadPre",
        config = function()
            require('lspconfig.ui.windows').default_options.border = 'rounded'
            vim.api.nvim_set_hl(0, "LspInfoBorder", { bg = none, fg = "#d4be98" })
            local opts = { noremap = true, silent = true }
            vim.keymap.set('n', '<space>cd', vim.diagnostic.open_float, opts)
            vim.keymap.set('n', '<space>cl', "<cmd>LspInfo<cr>", 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', '<space>q', vim.diagnostic.setloclist, opts)

            local on_attach = function(client, bufnr)
                -- enable completion triggered by <c-x><c-o>
                vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc')

                -- Mappings.
                -- See `:help vim.lsp.*` for documentation on any of the below functions
                local bufopts = { noremap = true, silent = true, buffer = bufnr }
                vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, bufopts)
                vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts)
                vim.keymap.set('n', '<leader>k', vim.lsp.buf.hover, bufopts)
                vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, bufopts)
                -- vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts)
                vim.keymap.set('n', 'gK', vim.lsp.buf.signature_help, bufopts)
                vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, bufopts)
                vim.keymap.set('n', '<space>wa', vim.lsp.buf.add_workspace_folder, bufopts)
                vim.keymap.set('n', '<space>wr', vim.lsp.buf.remove_workspace_folder, bufopts)
                vim.keymap.set('n', '<space>wl', function()
                    print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
                end, bufopts)
                vim.keymap.set('n', '<space>gt', vim.lsp.buf.type_definition, bufopts)
                vim.keymap.set('n', '<space>cw', vim.lsp.buf.rename, bufopts)
                vim.keymap.set('n', '<space>ca', vim.lsp.buf.code_action, bufopts)
                vim.keymap.set('n', '<space>cf', function() vim.lsp.buf.format { async = true } end, bufopts)
                vim.keymap.set('v', '<space>cf', function() vim.lsp.buf.format { async = true } end, bufopts)
            end

            local signs = { Error = "✘ ", Warn = " ", Hint = " ", Info = " " }
            -- local signs = { Error = "✘ ", Warn = " ", Hint = " ", Info = " " }
            -- local signs = { Error = "✘ ", Warn = "⚠ ", Hint = " ", Info = " " } -- Unicode
            for type, icon in pairs(signs) do
                local hl = "DiagnosticSign" .. type
                vim.fn.sign_define(hl, { text = icon, texthl = hl })
            end


            local border = {
                { "╭", "FloatBorder" },
                { "─", "FloatBorder" },
                { "╮", "FloatBorder" },
                { "│", "FloatBorder" },
                { "╯", "FloatBorder" },
                { "─", "FloatBorder" },
                { "╰", "FloatBorder" },
                { "│", "FloatBorder" },
            }

            vim.diagnostic.config({
                float = { border = border },
                virtual_text = {
                    prefix = '●', -- Could be '●', '■', 'x', '▎'
                },
                update_in_insert = true
            })

            -- LSP settings (for overriding per client)
                vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, { border = border })
                vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signatureHelp, { border = border })
        end,
    },

    {
        "williamboman/mason.nvim",
        lazy = true,
        cmd = "Mason",
        config = function()
            require("mason").setup({
                ui = {
                    border = "rounded",
                    icons = {
                        package_installed = "✔",
                        package_pending = "➜",
                        package_uninstalled = "✘"
                    }
                }
            })
        end,
    },

    {
        "williamboman/mason-lspconfig.nvim",
        -- event = "BufReadPre",
        config = function()
            require("mason-lspconfig").setup({
                ensure_installed = {
                    "lua_ls",
                    "clangd",
                }
            })

            require("mason-lspconfig").setup_handlers {
                -- The first entry (without a key) will be the default handler
                -- and will be called for each installed server that doesn't have
                -- a dedicated handler.
                function(server_name) -- default handler (optional)
                    require("lspconfig")[server_name].setup {
                        on_attach = on_attach,
                        handlers = handlers,
                    }
                end,
            }
        end,
    },
}
