From 77e82698a3bc93c06f1517af566b0c8dd0ed5540 Mon Sep 17 00:00:00 2001 From: Matt Leong Date: Tue, 14 Dec 2021 12:21:42 -0800 Subject: [PATCH] feat(plugins): readd autocomplete from cosmic-ui --- lua/cosmic/core/pluginsInit.lua | 2 +- lua/cosmic/lsp/autocomplete.lua | 111 ++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 lua/cosmic/lsp/autocomplete.lua diff --git a/lua/cosmic/core/pluginsInit.lua b/lua/cosmic/core/pluginsInit.lua index b44991a..c28aa30 100644 --- a/lua/cosmic/core/pluginsInit.lua +++ b/lua/cosmic/core/pluginsInit.lua @@ -112,7 +112,7 @@ return packer.startup(function() use({ 'hrsh7th/nvim-cmp', config = function() - require('cosmic-ui').setup_autocomplete() + require('cosmic.lsp.autocomplete').init() end, requires = { { 'onsails/lspkind-nvim' }, diff --git a/lua/cosmic/lsp/autocomplete.lua b/lua/cosmic/lsp/autocomplete.lua new file mode 100644 index 0000000..cf1fbab --- /dev/null +++ b/lua/cosmic/lsp/autocomplete.lua @@ -0,0 +1,111 @@ +local utils = require('cosmic-ui.utils') +local cosmic_ui = require('cosmic-ui') +local M = {} + +local has_words_before = function() + 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 get_formatting = function() + local ok, _ = pcall(require, 'lspkind') + if not ok then + return {} + end + + return { + format = require('lspkind').cmp_format({ + with_text = true, + menu = { + buffer = '[buf]', + nvim_lsp = '[LSP]', + nvim_lua = '[VimApi]', + path = '[path]', + luasnip = '[snip]', + }, + }), + } +end + +M.init = function(provider_opts) + local cmp = require('cmp') + -- @TODO: support for vsnip, ultisnips + local default_cmp_opts = { + snippet = { + expand = function(args) + require('luasnip').lsp_expand(args.body) + end, + }, + mapping = { + [''] = cmp.mapping(cmp.mapping.scroll_docs(-4), { 'i', 'c' }), + [''] = cmp.mapping(cmp.mapping.scroll_docs(4), { 'i', 'c' }), + [''] = cmp.mapping(cmp.mapping.complete(), { 'i', 'c' }), + [''] = cmp.mapping({ + i = cmp.mapping.abort(), + c = cmp.mapping.close(), + }), + -- disabled for autopairs mapping + [''] = cmp.mapping.confirm({ + behavior = cmp.ConfirmBehavior.Insert, + select = true, + }), + [''] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + elseif require('luasnip').expand_or_jumpable() then + require('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 require('luasnip').jumpable(-1) then + require('luasnip').jump(-1) + else + fallback() + end + end, { + 'i', + 's', + }), + }, + documentation = { + border = cosmic_ui.get_border(), + winhighlight = 'FloatBorder:FloatBorder,Normal:Normal', + }, + experimental = { + ghost_text = true, + }, + sources = cmp.config.sources({ + { name = 'nvim_lsp' }, + { name = 'nvim_lua' }, + { name = 'buffer' }, + { name = 'luasnip' }, + { name = 'path' }, + }), + formatting = get_formatting(), + } + + vim.cmd([[ + autocmd FileType TelescopePrompt lua require('cmp').setup.buffer { enabled = false } + ]]) + + local opts = utils.merge(default_cmp_opts, provider_opts or {}) + + cmp.setup(opts) + + cmp.setup.cmdline('/', { + sources = { + { name = 'buffer' }, + }, + }) +end + +return M