diff --git a/nvim/.config/nvim/after/plugin/nvim-cmp.lua b/nvim/.config/nvim/after/plugin/nvim-cmp.lua index c95305c..d28e3d2 100644 --- a/nvim/.config/nvim/after/plugin/nvim-cmp.lua +++ b/nvim/.config/nvim/after/plugin/nvim-cmp.lua @@ -1,4 +1,12 @@ --- Set up nvim-cmp. +-- Set up nvim-cmp with 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 + +local luasnip = require("luasnip") local cmp = require'cmp' cmp.setup({ @@ -22,6 +30,29 @@ cmp.setup({ [''] = 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(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, { "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' },