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 = "#9da9a0" })
      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')
      end

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

      vim.diagnostic.config({
        signs = { text = { [vim.diagnostic.severity.ERROR] = "✘ ", [vim.diagnostic.severity.WARN] = " ", [vim.diagnostic.severity.HINT] = " ", [vim.diagnostic.severity.INFO] = " " } },
        float = { border = border },
        virtual_text = {
          prefix = '●', -- Could be '●', '■', 'x', '▎', or anything else
        },
        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,
  },

  -- pretty ui
  {
    'nvimdev/lspsaga.nvim',
    event = 'LspAttach',
    config = function()
      require('lspsaga').setup({
        symbol_in_winbar = {
          enable = false,
          show_file = false
        },
        finder = {
          keys = {
            toggle_or_open = "<cr>",
            quit = { '<Esc>', 'q' }
          }
        },
        outline = {
          win_position = 'right',
          win_width = 32,
          auto_preview = true,
        },
        lightbulb = {
          enable = false
        },
        ui = {
          code_action = '',
          title = true,
          border = 'rounded',
        },
        rename = {
          in_select = false,
          keys = {
            quit = { '<Esc>', 'q' },
            select = '<Space>'
          }
        },
        hover_doc = {
          open_cmd = '!firefox'
        },
        code_action = {
          keys = {
            quit = { '<Esc>', 'q' }
          },
          extend_gitsigns = false,
        },
        definition = {
          keys = {
            quit = { '<Esc>', 'q' },
          },
        },
        diagnostic = {
          border_follow = true,
          extend_relatedInformation = true,
          keys = {
            quit = { '<Esc>', 'q' },
            quit_in_show = { '<Esc>', 'q' },
          }
        }
      })

      vim.keymap.set('n', '<C-n>', "<cmd>Lspsaga term_toggle<cr>", opts)
      vim.keymap.set('t', '<C-n>', "<cmd>Lspsaga term_toggle<cr>", opts)
      vim.keymap.set('n', '<space>so', '<cmd>Lspsaga outline<cr>', opts)
      vim.keymap.set('n', '<space>sf', '<cmd>Lspsaga finder<cr>', opts)
      vim.keymap.set('n', '<space>sci', '<cmd>Lspsaga incoming_calls<cr>', opts)
      vim.keymap.set('n', '<space>sco', '<cmd>Lspsaga outgoing_calls<cr>', opts)
      vim.keymap.set('n', '<leader>k', '<cmd>Lspsaga hover_doc<cr>', bufopts)
      vim.keymap.set('n', 'K', '<cmd>Lspsaga hover_doc<cr>', bufopts)
      vim.keymap.set('n', '<space>ca', '<cmd>Lspsaga code_action<cr>', bufopts)
      vim.keymap.set('n', '<space>sd', '<cmd>Lspsaga peek_definition<cr>', bufopts)
      vim.keymap.set('n', '<space>st', '<cmd>Lspsaga peek_type_definition<cr>', bufopts)
      vim.keymap.set('n', '<space>cw', "<cmd>Lspsaga rename mode=n<cr>", bufopts)
      vim.keymap.set('n', '<space>ca', '<cmd>Lspsaga code_action<cr>', bufopts)
      vim.keymap.set('n', '[e', '<cmd>Lspsaga diagnostic_jump_next<cr>', bufopts)
      vim.keymap.set('n', ']e', '<cmd>Lspsaga diagnostic_jump_prev<cr>', bufopts)
    end,
    depedencies = {
      'nvim-treesitter/nvim-treesitter',
      'nvim-tree/nvim-web-devicons'
    },
  },

  {
    "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,
  },
  {
    "nvimtools/none-ls.nvim",
    -- event = "BufReadPost",
    dependencies = {
      {
        "nvim-telescope/telescope-ui-select.nvim",
        lazy = true,
        config = function()
          -- This is your opts table
          require("telescope").setup {
            extensions = {
              ["ui-select"] = {
                -- require("telescope.themes").get_dropdown {
                --     -- even more opts
                -- }
              }
            }
          }
          require("telescope").load_extension("ui-select")
        end,
      },
    },
    opts = function()
      local null_ls = require('null-ls')
      return {
        border = 'rounded',
        on_attach = function(client, bufnr)
          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', '<space>gt', vim.lsp.buf.type_definition, bufopts)
          vim.keymap.set('n', '<space>cA', vim.lsp.buf.code_action, bufopts)
          vim.keymap.set('n', '<space>gr', vim.lsp.buf.references, 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,
        sources = {
          null_ls.builtins.diagnostics.trail_space.with {
            disabled_filetypes = { "lua" }
          },
          null_ls.builtins.code_actions.gitsigns,
          null_ls.builtins.diagnostics.yamllint,
          null_ls.builtins.formatting.yamlfmt,
          null_ls.builtins.formatting.shfmt,
          null_ls.builtins.formatting.shellharden,
        },
      }
    end,
  }
}