From cfbd3fcacba004d059bd5de9682910f98b7e677e Mon Sep 17 00:00:00 2001 From: Marcelo Jacobus Date: Fri, 21 Jun 2024 11:19:43 -0300 Subject: [PATCH] Supertab completion --- lua/plugins/nvim-cmp.lua | 71 +++++++++++++++++++++++++++++++++------- 1 file changed, 59 insertions(+), 12 deletions(-) diff --git a/lua/plugins/nvim-cmp.lua b/lua/plugins/nvim-cmp.lua index d717f0a..12e4716 100644 --- a/lua/plugins/nvim-cmp.lua +++ b/lua/plugins/nvim-cmp.lua @@ -1,19 +1,66 @@ +local supertab = function(opts) + 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 cmp = require("cmp") + + local prev = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_prev_item() + elseif vim.snippet.active({ direction = -1 }) then + vim.schedule(function() + vim.snippet.jump(-1) + end) + else + fallback() + end + end, { "i", "s" }) + + opts.mapping = vim.tbl_extend("force", opts.mapping, { + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + -- You could replace select_next_item() with confirm({ select = true }) to get VS Code autocompletion behavior + cmp.select_next_item() + elseif vim.snippet.active({ direction = 1 }) then + vim.schedule(function() + vim.snippet.jump(1) + end) + elseif has_words_before() then + cmp.complete() + else + fallback() + end + end, { "i", "s" }), + [""] = prev, + [""] = prev, + }) +end + +local function format(opts) + -- Set custom formatting to add padding + opts.formatting = { + format = function(entry, vim_item) + -- vim_item.abbr = " " .. vim_item.abbr .. " " -- Add padding + return vim_item + end, + } + + -- Set custom window options + opts.window = { + completion = require("cmp").config.window.bordered(), + documentation = require("cmp").config.window.bordered(), + } +end + return { { "hrsh7th/nvim-cmp", opts = function(_, opts) - -- Set custom formatting to add padding - opts.formatting = { - format = function(entry, vim_item) - -- vim_item.abbr = " " .. vim_item.abbr .. " " -- Add padding - return vim_item - end, - } - -- Set custom window options - opts.window = { - completion = require("cmp").config.window.bordered(), - documentation = require("cmp").config.window.bordered(), - } + supertab(opts) + format(opts) end, }, }