-- Auto-completion / Snippets return { -- https://github.com/hrsh7th/nvim-cmp "hrsh7th/nvim-cmp", event = "InsertEnter", dependencies = { -- Snippet engine & associated nvim-cmp source -- https://github.com/L3MON4D3/LuaSnip "L3MON4D3/LuaSnip", -- https://github.com/saadparwaiz1/cmp_luasnip "saadparwaiz1/cmp_luasnip", -- LSP completion capabilities -- https://github.com/hrsh7th/cmp-nvim-lsp "hrsh7th/cmp-nvim-lsp", -- Additional user-friendly snippets -- https://github.com/rafamadriz/friendly-snippets "rafamadriz/friendly-snippets", -- https://github.com/hrsh7th/cmp-buffer "hrsh7th/cmp-buffer", -- https://github.com/hrsh7th/cmp-path "hrsh7th/cmp-path", -- https://github.com/hrsh7th/cmp-cmdline "hrsh7th/cmp-cmdline", -- sql completion "kristijanhusak/vim-dadbod-completion", {"onsails/lspkind.nvim", lazy = true}, }, config = function() local cmp = require("cmp") local luasnip = require("luasnip") local lspkind = require('lspkind') require("luasnip.loaders.from_vscode").lazy_load() luasnip.config.setup({}) cmp.setup({ snippet = { expand = function(args) luasnip.lsp_expand(args.body) end, }, completion = { completeopt = "menu,menuone,noinsert", }, mapping = cmp.mapping.preset.insert({ [""] = cmp.mapping.select_next_item(), -- next suggestion [""] = cmp.mapping.select_prev_item(), -- previous suggestion [""] = cmp.mapping.scroll_docs(-4), -- scroll backward [""] = cmp.mapping.scroll_docs(4), -- scroll forward [""] = cmp.mapping.complete({}), -- show completion suggestions [""] = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = true, }), -- Tab through suggestions or when a snippet is active, tab to the next argument [""] = cmp.mapping(function(fallback) if cmp.visible() then -- cmp.select_next_item() cmp.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = true, }) elseif luasnip.expand_or_locally_jumpable() then luasnip.expand_or_jump() else fallback() end end, { "i", "s" }), -- Tab backwards through suggestions or when a snippet is active, tab to the next argument [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_prev_item() elseif luasnip.locally_jumpable(-1) then luasnip.jump(-1) else fallback() end end, { "i", "s" }), }), sources = cmp.config.sources({ { name = "vim-dadbod-completion" }, -- sql { name = "nvim_lsp" }, -- lsp { name = "luasnip" }, -- snippets { name = "buffer" }, -- text within current buffer { name = "path" }, -- file system paths }), window = { completion = { width = 23, max_height = 13, border = "rounded", winhighlight = "Normal:CmpPmenu,CursorLine:PmenuSel,Search:None", -- winhighlight = "Normal:CmpPmenu,FloatBorder:CmpPmenuBorder,CursorLine:PmenuSel,Search:None", }, documentation = { max_width = 72, max_height = 23, border = "rounded", winhighlight = "Normal:CmpDoc", }, }, formatting = { fields = { "kind", "abbr", "menu" }, format = function(entry, vim_item) local kind = require("lspkind").cmp_format({ mode = "symbol_text", maxwidth = 42, ellipsis_char = "ยทยท", -- show_labelDetails = true, menu = ({ buffer = "Bfr", nvim_lsp = "LSP", luasnip = "Snp", nvim_lua = "Lua", latex_symbols = "Ltx", }) })(entry, vim_item) local strings = vim.split(kind.kind, "%s", { trimempty = true }) local men = kind.menu kind.kind = (strings[1] or "") .. " " kind.menu = (men or "") .. " | " .. (strings[2] or "") return kind end, }, -- formatting = { -- format = lspkind.cmp_format({ -- mode = "symbol_text", -- text_symbol or symbol_text -- maxwidth = 23, -- ellipsis_char = '..', -- show_labelDetails = true, -- menu = ({ -- buffer = "[Buffer]", -- nvim_lsp = "[LSP]", -- luasnip = "[LuaSnip]", -- nvim_lua = "[Lua]", -- latex_symbols = "[Latex]", -- }) -- }), -- }, view = { entries = {name = 'custom', selection_order = 'near_cursor' } }, }) end, }