diff --git a/lua/cosmic/config/examples/config.lua b/lua/cosmic/config/examples/config.lua index 816a53d..d0de767 100644 --- a/lua/cosmic/config/examples/config.lua +++ b/lua/cosmic/config/examples/config.lua @@ -56,6 +56,10 @@ config.lsp = { -- If adding additional sources, be sure to also copy the defaults that you would like to preserve from lsp/providers/null_ls.lua ts_utils = {}, } + +-- See :h cmp-usage +config.autocomplete = {} + -- See https://github.com/rmagatti/auto-session#%EF%B8%8F-configuration config.auto_session = {} diff --git a/lua/cosmic/core/pluginsInit.lua b/lua/cosmic/core/pluginsInit.lua index c28aa30..ab0a87d 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.lsp.autocomplete').init() + require('cosmic.plugins.nvim-cmp') end, requires = { { 'onsails/lspkind-nvim' }, diff --git a/lua/cosmic/lsp/autocomplete.lua b/lua/cosmic/lsp/autocomplete.lua deleted file mode 100644 index cf1fbab..0000000 --- a/lua/cosmic/lsp/autocomplete.lua +++ /dev/null @@ -1,111 +0,0 @@ -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 diff --git a/lua/cosmic/plugins/nvim-cmp/init.lua b/lua/cosmic/plugins/nvim-cmp/init.lua new file mode 100644 index 0000000..19817ca --- /dev/null +++ b/lua/cosmic/plugins/nvim-cmp/init.lua @@ -0,0 +1,115 @@ +local cmp = require('cmp') +local utils = require('cosmic-ui.utils') +local cosmic_ui = require('cosmic-ui') +local config = require('cosmic.config') + +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 + +-- @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, config.autocomplete or {}) + +cmp.setup(opts) + +cmp.setup.cmdline('/', { + sources = { + { name = 'buffer' }, + }, +}) + +-- cmp.setup.cmdline(':', { +-- sources = cmp.config.sources({ +-- { name = 'path' }, +-- }, { +-- { name = 'cmdline' }, +-- }), +-- })