return { { -- Autocompletion 'hrsh7th/nvim-cmp', event = 'InsertEnter', dependencies = { -- Snippet Engine & its associated nvim-cmp source { 'L3MON4D3/LuaSnip', build = (function() -- Build Step is needed for regex support in snippets. -- This step is not supported in many windows environments. -- Remove the below condition to re-enable on windows. if vim.fn.has 'win32' == 1 or vim.fn.executable 'make' == 0 then return end return 'make install_jsregexp' end)(), dependencies = { -- `friendly-snippets` contains a variety of premade snippets. -- See the README about individual language/framework/plugin snippets: -- https://github.com/rafamadriz/friendly-snippets -- { -- 'rafamadriz/friendly-snippets', -- config = function() -- require('luasnip.loaders.from_vscode').lazy_load() -- end, -- }, }, }, 'saadparwaiz1/cmp_luasnip', -- Adds other completion capabilities. -- nvim-cmp does not ship with all sources by default. They are split -- into multiple repos for maintenance purposes. 'hrsh7th/cmp-nvim-lsp', 'hrsh7th/cmp-path', 'hrsh7th/cmp-nvim-lsp-signature-help', { dir = '~/code/cmp-ai' }, }, config = function() -- See `:help cmp` local cmp = require 'cmp' local types = require 'cmp.types' local luasnip = require 'luasnip' luasnip.config.setup {} local cmp_ai = require 'cmp_ai.config' cmp_ai:setup { provider_options = { base_url = os.getenv 'LLAMA_API_BASE' or 'http://localhost:8080/ollama', api_key = os.getenv 'LLAMA_API_KEY', prompt = function(lines_before, lines_after) return lines_before -- return '
' .. lines_before .. '' .. lines_after .. ' ' -- return ' ' .. lines_before .. ' ' .. lines_after .. ' ' -- return '<|fim_prefix|>' .. lines_before .. '<|fim_suffix|>' .. lines_after .. '<|fim_middle|>' end, suffix = function(lines_after) return lines_after end, }, max_lines = 500, run_on_every_keystroke = false, notify = true, } vim.api.nvim_set_hl(0, 'CmpItemKindOllama', { fg = '#6cc644' }) cmp.setup { snippet = { expand = function(args) luasnip.lsp_expand(args.body) end, }, completion = { completeopt = 'menu,menuone,noinsert' }, -- For an understanding of why these mappings were -- chosen, you will need to read `:help ins-completion` -- -- No, but seriously. Please read `:help ins-completion`, it is really good! mapping = cmp.mapping.preset.insert { -- Disable use of and for navigation within a completion list. [' '] = cmp.mapping.close(), [' '] = cmp.mapping.close(), -- Identical to old key behavior [' '] = cmp.mapping.select_next_item { behavior = types.cmp.SelectBehavior.Select }, -- Identical to old key behavior [' '] = cmp.mapping.select_prev_item { behavior = types.cmp.SelectBehavior.Select }, -- Select the [n]ext item [' '] = cmp.mapping.select_next_item(), -- Select the [p]revious item [' '] = cmp.mapping.select_prev_item(), -- Scroll the documentation window [b]ack / [f]orward [' '] = cmp.mapping.scroll_docs(-4), [' '] = cmp.mapping.scroll_docs(4), -- Accept ([y]es) the completion. -- This will auto-import if your LSP supports it. -- This will expand snippets if the LSP sent a snippet. [' '] = cmp.mapping.confirm { select = true }, -- Cancel/abort any selected/partial completion and close the completion list. [' '] = cmp.mapping.abort(), -- If you prefer more traditional completion keymaps, -- you can uncomment the following lines --[' '] = cmp.mapping.confirm { select = true }, --[' '] = cmp.mapping.select_next_item(), --[' '] = cmp.mapping.select_prev_item(), -- Manually trigger a completion from nvim-cmp. -- Generally you don't need this, because nvim-cmp will display -- completions whenever it has completion options available. [' '] = cmp.mapping.complete {}, -- Think of as moving to the right of your snippet expansion. -- So if you have a snippet that's like: -- function $name($args) -- $body -- end -- -- will move you to the right of each of the expansion locations. -- is similar, except moving you backwards. [' '] = cmp.mapping(function() if luasnip.expand_or_locally_jumpable() then luasnip.expand_or_jump() end end, { 'i', 's' }), [' '] = cmp.mapping(function() if luasnip.locally_jumpable(-1) then luasnip.jump(-1) end end, { 'i', 's' }), [' '] = cmp.mapping.complete { config = { sources = cmp.config.sources { { name = 'cmp_ai' }, }, }, }, -- For more advanced Luasnip keymaps (e.g. selecting choice nodes, expansion) see: -- https://github.com/L3MON4D3/LuaSnip?tab=readme-ov-file#keymaps }, sources = { { name = 'lazydev', -- set group index to 0 to skip loading LuaLS completions as lazydev recommends it group_index = 0, }, { name = 'nvim_lsp', entry_filter = function(entry, ctx) -- do not show snippets in the completion list return require('cmp').lsp.CompletionItemKind.Snippet ~= entry:get_kind() end, }, { name = 'luasnip' }, { name = 'path' }, { name = 'nvim_lsp_signature_help' }, }, } end, }, } -- vim: ts=2 sts=2 sw=2 et