From b491f9e3a73367dfd54ca8f8bc74008332c80f34 Mon Sep 17 00:00:00 2001 From: Kyren223 Date: Mon, 8 Jul 2024 01:13:30 +0300 Subject: Neovim: reworked most of the completion stuff, 80% done, will continue tmr --- .config/nvim/lua/custom/completion.lua | 99 ++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) (limited to '.config/nvim/lua/custom/completion.lua') diff --git a/.config/nvim/lua/custom/completion.lua b/.config/nvim/lua/custom/completion.lua index e69de29..50df64b 100644 --- a/.config/nvim/lua/custom/completion.lua +++ b/.config/nvim/lua/custom/completion.lua @@ -0,0 +1,99 @@ +require('custom.snippets.lua') +local luasnip = require('luasnip') +local cmp = require('cmp') + +-- Enable paretheses for function completions +cmp.event:on('confirm_done', require('nvim-autopairs.completion.cmp').on_confirm_done()) + +-- Helper functions +local function tab(is_forward) + cmp.mapping(function(fallback) + local jump_amount = is_forward and 1 or -1 + if cmp.visible() then + local behaviour = cmp.SelectBehavior.Select + local select_item = is_forward and cmp.select_next_item or cmp.select_prev_item + select_item({ behaviour = behaviour }) + elseif luasnip.locally_jumpable(jump_amount) then + luasnip.jump(jump_amount) + else + fallback() + end + end, { 'i', 's' }) +end + +local function enter() end + +local function is_enabled() + local context = require('cmp.config.context') + + local is_in_comment = context.in_treesitter_capture('comment') or context.in_syntax_group('Comment') + if is_in_comment then + return false + end + + return true +end + +cmp.setup({ + enabled = is_enabled, + completion = { completeopt = 'menu,menuone,noinsert' }, + sources = cmp.config.sources({ + { name = 'nvim_lsp' }, + { name = 'luasnip' }, + { name = 'lazydev', group_index = 0 }, -- for lazydev.nvim + { name = 'path' }, -- for filesystem + }), + snippet = { + expand = function(args) + luasnip.lsp_expand(args.body) + end, + }, + window = { + -- TODO: Decide if I like borders or not + completion = cmp.config.window.bordered(), + documentation = cmp.config.window.bordered(), + }, + mapping = cmp.mapping.preset.insert({ + -- TODO: Make good keybindings + [''] = tab(true), + [''] = tab(false), + [''] = cmp.mapping(function(fallback) + if cmp.visible() then + if luasnip.expandable() then + luasnip.expand() + else + cmp.confirm({ select = true }) + end + else + fallback() + end + end), + + -- NOTE: Select makes it so it doesn't put the text in the buffer (like Insert or defualt does) + -- Ex: typing "p" and then select "private" will not write "private" in your buffer, but keep it "p" + -- Only after accepting the suggestion then it'll become "private" + [''] = cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Select }), + [''] = cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Select }), + + [''] = cmp.mapping( + cmp.mapping.confirm({ select = true, behavior = cmp.ConfirmBehavior.Insert }), + { 'i', 'c' } + ), + + [''] = cmp.mapping.complete(), -- invoke completion + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(4), + + -- [''] = cmp.mapping.abort(), + -- [''] = cmp.mapping.confirm({ select = true }), + -- [''] = cmp.mapping( + -- cmp.mapping.confirm({ + -- behavior = cmp.ConfirmBehavior.Insert, + -- select = true, + -- }), + -- { 'i', 'c' } + -- ), + }), +}) + +print('Sourced lsp.lua') -- cgit v1.3.1