return { -- auto completion { "hrsh7th/nvim-cmp", version = false, -- last release is way too old event = "InsertEnter", dependencies = { "hrsh7th/cmp-nvim-lsp", "hrsh7th/cmp-buffer", "hrsh7th/cmp-path", }, -- Not all LSP servers add brackets when completing a function. -- To better deal with this, LazyVim adds a custom option to cmp, -- that you can configure. For example: -- -- ```lua -- opts = { -- auto_brackets = { "python" } -- } -- ``` opts = function() vim.api.nvim_set_hl(0, "CmpGhostText", { link = "Comment", default = true }) local cmp = require("cmp") local defaults = require("cmp.config.default")() return { auto_brackets = {}, -- configure any filetype to auto add brackets completion = { completeopt = "menu,menuone,noinsert", }, mapping = cmp.mapping.preset.insert({ [""] = cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Insert }), [""] = cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Insert }), [""] = cmp.mapping.scroll_docs(-4), [""] = cmp.mapping.scroll_docs(4), [""] = cmp.mapping.complete(), [""] = cmp.mapping.abort(), [""] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. [""] = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = true, }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. [""] = function(fallback) cmp.abort() fallback() end, }), sources = cmp.config.sources({ { name = "nvim_lsp" }, { name = "path" }, }, { { name = "buffer" }, }), formatting = { format = function(_, item) local icons = require("lazyvim.config").icons.kinds if icons[item.kind] then item.kind = icons[item.kind] .. item.kind end return item end, }, experimental = { ghost_text = { hl_group = "CmpGhostText", }, }, sorting = defaults.sorting, } end, ---@param opts cmp.ConfigSchema | {auto_brackets?: string[]} config = function(_, opts) for _, source in ipairs(opts.sources) do source.group_index = source.group_index or 1 end local cmp = require("cmp") local Kind = cmp.lsp.CompletionItemKind cmp.setup(opts) cmp.event:on("confirm_done", function(event) if not vim.tbl_contains(opts.auto_brackets or {}, vim.bo.filetype) then return end local entry = event.entry local item = entry:get_completion_item() if vim.tbl_contains({ Kind.Function, Kind.Method }, item.kind) and item.insertTextFormat ~= 2 then local cursor = vim.api.nvim_win_get_cursor(0) local prev_char = vim.api.nvim_buf_get_text(0, cursor[1] - 1, cursor[2], cursor[1] - 1, cursor[2] + 1, {})[1] if prev_char ~= "(" and prev_char ~= ")" then local keys = vim.api.nvim_replace_termcodes("()", false, false, true) vim.api.nvim_feedkeys(keys, "i", true) end end end) end, }, -- snippets vim.snippet and { "nvim-cmp", dependencies = { { "rafamadriz/friendly-snippets" }, { "garymjr/nvim-snippets", opts = { friendly_snippets = true } }, }, opts = function(_, opts) opts.snippet = { expand = function(args) vim.snippet.expand(args.body) end, } table.insert(opts.sources, { name = "snippets" }) end, keys = { { "", function() if vim.snippet.active({ direction = 1 }) then vim.schedule(function() vim.snippet.jump(1) end) return end return "" end, expr = true, silent = true, mode = "i", }, { "", function() vim.schedule(function() vim.snippet.jump(1) end) end, silent = true, mode = "s", }, { "", function() if vim.snippet.active({ direction = -1 }) then vim.schedule(function() vim.snippet.jump(-1) end) return end return "" end, expr = true, silent = true, mode = { "i", "s" }, }, }, } or { import = "lazyvim.plugins.extras.coding.luasnip", enabled = vim.fn.has("nvim-0.10") == 0 }, -- auto pairs { "echasnovski/mini.pairs", event = "VeryLazy", opts = { mappings = { ["`"] = { action = "closeopen", pair = "``", neigh_pattern = "[^\\`].", register = { cr = false } }, }, }, keys = { { "up", function() vim.g.minipairs_disable = not vim.g.minipairs_disable if vim.g.minipairs_disable then LazyVim.warn("Disabled auto pairs", { title = "Option" }) else LazyVim.info("Enabled auto pairs", { title = "Option" }) end end, desc = "Toggle Auto Pairs", }, }, }, -- comments { "JoosepAlviste/nvim-ts-context-commentstring", lazy = true, opts = { enable_autocmd = false, }, }, { import = "lazyvim.plugins.extras.coding.mini-comment", enabled = function() if vim.fn.has("nvim-0.10") == 1 then -- Majestically override the native `get_commentstring` function. vim.schedule(function() LazyVim.inject.set_upvalue( LazyVim.inject.get_upvalue(require("vim._comment").textobject, "get_comment_parts"), "get_commentstring", function() return require("ts_context_commentstring.internal").calculate_commentstring() or vim.bo.commentstring end ) end) else return true end end, }, }