From 95d3e129ad9b76d401b62ca1cb89a81598810218 Mon Sep 17 00:00:00 2001 From: mace Date: Sat, 29 Nov 2025 19:10:35 +0100 Subject: [PATCH] improve nvim-cmp --- lua/custom/nvim-cmp.lua | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/lua/custom/nvim-cmp.lua b/lua/custom/nvim-cmp.lua index 4cc6047..7e40460 100644 --- a/lua/custom/nvim-cmp.lua +++ b/lua/custom/nvim-cmp.lua @@ -19,6 +19,11 @@ end -- load vs-code like snippets from plugins (e.g. friendly-snippets) require("luasnip/loaders/from_vscode").lazy_load() +local function has_words_before() + local line, col = unpack(vim.api.nvim_win_get_cursor(0)) + return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil +end + vim.opt.completeopt = "menu,menuone,noselect" cmp.setup({ @@ -34,20 +39,40 @@ cmp.setup({ }, mapping = cmp.mapping.preset.insert({ - [""] = cmp.mapping.select_prev_item(), -- previous suggestion - [""] = cmp.mapping.select_next_item(), -- next suggestion + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_prev_item() + elseif luasnip.jumpable(-1) then + luasnip.jump(-1) + else + fallback() + end + end, { "i", "s" }), + + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + elseif luasnip.expand_or_jumpable() then + luasnip.expand_or_jump() + elseif has_words_before() then + cmp.complete() + else + fallback() + end + end, { "i", "s" }), + [""] = cmp.mapping.scroll_docs(-4), [""] = cmp.mapping.scroll_docs(4), - [""] = cmp.mapping.complete(), -- show completion suggestions - [""] = cmp.mapping.abort(), -- close completion window + [""] = cmp.mapping.complete(), + [""] = cmp.mapping.abort(), [""] = cmp.mapping.confirm({ select = true }), }), -- sources for autocompletion sources = cmp.config.sources({ - { name = "nvim_lsp" }, -- lsp - { name = "luasnip" }, -- snippets + { name = "nvim_lsp" }, -- lsp + { name = "luasnip" }, -- snippets { name = "buffer", keyword_length = 5 }, -- text within current buffer - { name = "path" }, -- file system paths + { name = "path" }, -- file system paths }), -- configure lspkind for vs-code like icons formatting = {