diff --git a/lua/plugins/cmp.lua b/lua/plugins/cmp.lua index 4fe090c..09f3cb3 100644 --- a/lua/plugins/cmp.lua +++ b/lua/plugins/cmp.lua @@ -32,7 +32,7 @@ return { } }, }, - config = function () + config = function() require("copilot_cmp").setup() end }, @@ -40,6 +40,12 @@ return { config = function() local cmp = require('cmp') local lspkind = require('lspkind') + local luasnip = require('luasnip') + local has_words_before = function() + unpack = unpack or table.unpack + 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 cmp.setup({ snippet = { @@ -53,18 +59,44 @@ return { [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.complete(), - [''] = cmp.mapping.close(), + [''] = cmp.mapping.abort(), [''] = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = true, }), - [''] = function(fallback) + [""] = cmp.mapping({ + i = function(fallback) + if cmp.visible() and cmp.get_active_entry() then + cmp.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = false }) + else + fallback() + end + end, + s = cmp.mapping.confirm({ select = true }), + c = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = true }), + }), + [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() + -- You could replace the expand_or_jumpable() calls with expand_or_locally_jumpable() + -- they way you will only jump inside the snippet region + elseif luasnip.expand_or_jumpable() then + luasnip.expand_or_jump() + elseif has_words_before() then + cmp.complete() else fallback() end - end + end, { "i", "s" }), + [""] = 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" }), }, sources = cmp.config.sources({ { name = 'nvim_lsp' },