return { { "smjonas/inc-rename.nvim", opts = {} }, { { "mason-org/mason-lspconfig.nvim", opts = { ensure_installed = { "lexical" } }, dependencies = { { "mason-org/mason.nvim", opts = {} }, { "neovim/nvim-lspconfig" }, { "hrsh7th/nvim-cmp" }, { "hrsh7th/cmp-nvim-lsp" }, { "hrsh7th/cmp-buffer" }, { "hrsh7th/cmp-path" }, { "saadparwaiz1/cmp_luasnip" }, { "L3MON4D3/LuaSnip" }, { "rafamadriz/friendly-snippets" }, }, config = function() vim.api.nvim_create_autocmd('LspAttach', { desc = 'LSP actions', callback = function() local bufmap = function(mode, lhs, rhs) local opts = { buffer = true } vim.keymap.set(mode, lhs, rhs, opts) end bufmap('n', 'K', 'lua vim.lsp.buf.hover()') bufmap('n', 'gd', 'lua vim.lsp.buf.definition()') bufmap('n', 'gD', 'lua vim.lsp.buf.declaration()') bufmap('n', 'gi', 'lua vim.lsp.buf.implementation()') bufmap('n', 'go', 'lua vim.lsp.buf.type_definition()') bufmap('n', 'gr', 'lua vim.lsp.buf.references()') bufmap('n', 'gs', 'lua vim.lsp.buf.signature_help()') bufmap('n', '', 'lua vim.lsp.buf.rename()') bufmap('n', '', 'lua vim.lsp.buf.format({async = true})') bufmap('n', '', 'lua vim.lsp.buf.code_action()') bufmap('n', 'gl', 'lua vim.diagnostic.open_float()') bufmap('n', '[d', 'lua vim.diagnostic.goto_prev()') bufmap('n', ']d', 'lua vim.diagnostic.goto_next()') end }) --- -- Diagnostics --- vim.diagnostic.config({ virtual_text = true, severity_sort = true, float = { border = 'rounded', source = 'always', }, }) vim.lsp.handlers['textDocument/hover'] = vim.lsp.with( vim.lsp.handlers.hover, { border = 'rounded' } ) vim.lsp.handlers['textDocument/signatureHelp'] = vim.lsp.with( vim.lsp.handlers.signature_help, { border = 'rounded' } ) --- -- LSP servers --- -- require('mason').setup({}) -- require('mason-lspconfig').setup({}) local lspconfig = require('lspconfig') local lsp_capabilities = require('cmp_nvim_lsp').default_capabilities() lspconfig.tsserver.setup({ capabilities = lsp_capabilities, }) lspconfig.lua_ls.setup({ capabilities = lsp_capabilities, }) --- -- Autocomplete --- vim.opt.completeopt = { 'menu', 'menuone', 'noselect' } require('luasnip.loaders.from_vscode').lazy_load() local cmp = require('cmp') local luasnip = require('luasnip') local select_opts = { behavior = cmp.SelectBehavior.Select } cmp.setup({ snippet = { expand = function(args) luasnip.lsp_expand(args.body) end }, sources = { { name = 'path' }, { name = 'nvim_lsp', keyword_length = 1 }, { name = 'buffer', keyword_length = 3 }, { name = 'luasnip', keyword_length = 2 }, }, window = { documentation = cmp.config.window.bordered() }, formatting = { fields = { 'menu', 'abbr', 'kind' }, format = function(entry, item) local menu_icon = { nvim_lsp = 'λ', luasnip = '⋗', buffer = 'Ω', path = '🖫', } item.menu = menu_icon[entry.source.name] return item end, }, mapping = { [''] = cmp.mapping.select_prev_item(select_opts), [''] = cmp.mapping.select_next_item(select_opts), [''] = cmp.mapping.select_prev_item(select_opts), [''] = cmp.mapping.select_next_item(select_opts), [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.abort(), [''] = cmp.mapping.confirm({ select = true }), [''] = cmp.mapping.confirm({ select = false }), [''] = cmp.mapping(function(fallback) if luasnip.jumpable(1) then luasnip.jump(1) else fallback() end end, { 'i', 's' }), [''] = cmp.mapping(function(fallback) if luasnip.jumpable(-1) then luasnip.jump(-1) else fallback() end end, { 'i', 's' }), [''] = cmp.mapping(function(fallback) local col = vim.fn.col('.') - 1 if cmp.visible() then cmp.select_next_item(select_opts) elseif col == 0 or vim.fn.getline('.'):sub(col, col):match('%s') then fallback() else cmp.complete() end end, { 'i', 's' }), [''] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_prev_item(select_opts) else fallback() end end, { 'i', 's' }), }, }) end } }, { "lukas-reineke/lsp-format.nvim", config = function() require("lsp-format").setup {} vim.api.nvim_create_autocmd('LspAttach', { callback = function(args) local client = assert(vim.lsp.get_client_by_id(args.data.client_id)) require("lsp-format").on_attach(client, args.buf) end, }) end, }, }