summaryrefslogtreecommitdiffstats
path: root/lua/conf/plugins/cmp.lua
diff options
context:
space:
mode:
authorSquibid <me@zacharyscheiman.com>2024-08-09 02:45:31 -0400
committerSquibid <me@zacharyscheiman.com>2024-08-09 02:45:31 -0400
commitc489d393695e90d424f9ae51e35c4d42358e6a71 (patch)
tree12ea97ec4684fd82cd6b73dd127d0137b115837b /lua/conf/plugins/cmp.lua
parentad76983d969c318e6e234bc82384b4b025d70447 (diff)
downloadnvim-c489d393695e90d424f9ae51e35c4d42358e6a71.tar.gz
nvim-c489d393695e90d424f9ae51e35c4d42358e6a71.tar.bz2
nvim-c489d393695e90d424f9ae51e35c4d42358e6a71.zip
yes there's a bit of java in my nvim config why do you ask?
Diffstat (limited to '')
-rw-r--r--lua/conf/plugins/cmp.lua170
1 files changed, 170 insertions, 0 deletions
diff --git a/lua/conf/plugins/cmp.lua b/lua/conf/plugins/cmp.lua
new file mode 100644
index 0000000..5dbb6ed
--- /dev/null
+++ b/lua/conf/plugins/cmp.lua
@@ -0,0 +1,170 @@
+local function has_words_before()
+ 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
+
+return { 'hrsh7th/nvim-cmp',
+ requires = {
+ 'danymat/neogen',
+ 'nvim-treesitter/nvim-treesitter',
+ 'lukas-reineke/cmp-under-comparator' -- better results
+ },
+
+ -- suppliers for completions (they require nvim-cmp to be loaded before they are)
+ deps = {
+ 'hrsh7th/cmp-buffer', -- buffers
+ 'FelipeLema/cmp-async-path', -- path
+ 'hrsh7th/cmp-nvim-lsp', -- lsp
+ 'hrsh7th/cmp-nvim-lsp-signature-help', -- completion information
+ { 'L3MON4D3/cmp-luasnip-choice', -- luasnip
+ requires = 'L3MON4D3/LuaSnip'
+ }
+ },
+
+ function()
+ local cmp = require('cmp')
+ local luasnip = require('luasnip')
+ local neogen = require('neogen')
+
+ cmp.setup {
+ -- disable when in comments
+ enabled = function()
+ local context = require('cmp.config.context')
+ if vim.api.nvim_get_mode().mode == 'c' then
+ return true
+ else
+ return not context.in_treesitter_capture("comment")
+ and not context.in_syntax_group("Comment")
+ end
+ end,
+
+ -- completion sources
+ sources = cmp.config.sources {
+ { name = 'nvim_lsp', priority = 999 },
+ { name = 'luasnip_choice', priority = 750 },
+ { name = 'buffer', max_item_count = 3 },
+ { name = 'async_path', max_item_count = 5 },
+ { name = 'neorg' },
+ { name = 'nvim_lsp_signature_help' }
+ },
+
+ -- how to sort results
+ sorting = {
+ comparators = {
+ cmp.config.compare.offset,
+ cmp.config.compare.exact,
+ cmp.config.compare.score,
+ require('cmp-under-comparator').under,
+ cmp.config.compare.kind,
+ cmp.config.compare.sort_text,
+ cmp.config.compare.length,
+ cmp.config.compare.order,
+ }
+ },
+
+ -- appearance of window
+ window = {
+ completion = {
+ scrollbar = false,
+ border = 'solid',
+ winhighlight = "Normal:WinBarNC,FloatBorder:WinBarNC,Search:WinBarNC",
+ },
+ documentation = {
+ border = 'solid',
+ winhighlight = "Normal:WinBarNC,FloatBorder:WinBarNC,Search:WinBarNC",
+ }
+ },
+
+ -- position of window
+ view = {
+ entries = {
+ name = 'custom',
+ selection_order = 'near_cursor'
+ }
+ },
+
+ -- formatting of content
+ formatting = {
+ fields = { 'menu', 'abbr', 'kind' },
+ format = function(entry, item)
+ local menu_icon = {
+ nvim_lsp = 'λ',
+ nvim_lua = 'v',
+ calc = '+',
+ luasnip = '%',
+ buffer = '@',
+ path = '#'
+ }
+
+ item.menu = menu_icon[entry.source.name]
+ return item
+ end
+ },
+
+ experimental = {
+ ghost_text = true
+ },
+
+ -- snippet integration
+ snippet = {
+ expand = function(args)
+ luasnip.lsp_expand(args.body)
+ end
+ },
+
+ -- mappings
+ mapping = cmp.mapping.preset.insert {
+ ["<Tab>"] = cmp.mapping(function(fallback)
+ if #cmp.get_entries() == 1 then
+ cmp.confirm({ select = true })
+ elseif cmp.visible() then
+ cmp.select_next_item()
+ elseif luasnip.expand_or_locally_jumpable() then
+ luasnip.expand_or_jump()
+ elseif has_words_before() then
+ cmp.complete()
+ if #cmp.get_entries() == 1 then
+ cmp.confirm({ select = true })
+ end
+ elseif neogen.jumpable() then
+ neogen.jump_next()
+ else
+ fallback()
+ end
+ end, { "i", "s" }),
+
+ ["<S-Tab>"] = cmp.mapping(function(fallback)
+ if cmp.visible() then
+ cmp.select_prev_item()
+ elseif luasnip.jumpable(-1) then
+ luasnip.jump(-1)
+ elseif neogen.jumpable(-1) then
+ neogen.jump_prev()
+ else
+ fallback()
+ end
+ end, { "i", "s" }),
+
+ ['<CR>'] = 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 }),
+ },
+
+ ["<C-u>"] = cmp.mapping.scroll_docs(-4),
+ ["<C-d>"] = cmp.mapping.scroll_docs(4),
+ ['<ESC>'] = cmp.mapping.close(),
+ ["<C-e>"] = cmp.mapping.abort()
+ }
+ }
+ end
+}