diff --git a/lua/lazyvim/config/options.lua b/lua/lazyvim/config/options.lua index 726f869d..bd506655 100644 --- a/lua/lazyvim/config/options.lua +++ b/lua/lazyvim/config/options.lua @@ -11,6 +11,20 @@ vim.g.autoformat = true -- enabled with `:LazyExtras` vim.g.lazyvim_picker = "auto" +-- if the completion engine supports the AI source, +-- use that instead of inline suggestions +vim.g.ai_cmp = true + +-- if `vim.g.ai_cmp` is false, or the completion engine does +-- not support the AI source, use inline suggestions +-- with the keymaps below +vim.g.ai_suggest_accept = "" +vim.g.ai_suggest_accept_word = false +vim.g.ai_suggest_accept_line = false +vim.g.ai_suggest_next = "" +vim.g.ai_suggest_prev = "" +vim.g.ai_suggest_clear = "" + -- LazyVim root dir detection -- Each entry can be: -- * the name of a detector function like `lsp` or `cwd` diff --git a/lua/lazyvim/plugins/coding.lua b/lua/lazyvim/plugins/coding.lua index 8f1d7968..af69afc3 100644 --- a/lua/lazyvim/plugins/coding.lua +++ b/lua/lazyvim/plugins/coding.lua @@ -72,9 +72,10 @@ return { end, }, experimental = { - ghost_text = { + -- only show ghost text when we show ai completions + ghost_text = vim.g.ai_cmp and { hl_group = "CmpGhostText", - }, + } or false, }, sorting = defaults.sorting, } diff --git a/lua/lazyvim/plugins/extras/ai/codeium.lua b/lua/lazyvim/plugins/extras/ai/codeium.lua index b95ad433..e6bf6d0b 100644 --- a/lua/lazyvim/plugins/extras/ai/codeium.lua +++ b/lua/lazyvim/plugins/extras/ai/codeium.lua @@ -1,17 +1,31 @@ return { + -- codeium + { + "Exafunction/codeium.nvim", + cmd = "Codeium", + build = ":Codeium Auth", + opts = { + enable_cmp_source = vim.g.ai_cmp, + virtual_text = { + enabled = not vim.g.ai_cmp, + accept_fallback = vim.g.ai_suggest_accept, + key_bindings = { + accept = vim.g.ai_suggest_accept, + accept_word = vim.g.ai_suggest_accept_word, + accept_line = vim.g.ai_suggest_accept_line, + next = vim.g.ai_suggest_next, + prev = vim.g.ai_suggest_prev, + clear = vim.g.ai_suggest_clear, + }, + }, + }, + }, -- codeium cmp source { "nvim-cmp", - dependencies = { - -- codeium - { - "Exafunction/codeium.nvim", - cmd = "Codeium", - build = ":Codeium Auth", - opts = {}, - }, - }, + optional = true, + dependencies = { "codeium.nvim" }, ---@param opts cmp.ConfigSchema opts = function(_, opts) table.insert(opts.sources, 1, { @@ -30,4 +44,18 @@ return { table.insert(opts.sections.lualine_x, 2, LazyVim.lualine.cmp_source("codeium")) end, }, + + { + "saghen/blink.cmp", + optional = true, + opts = { + sources = { + compat = vim.g.ai_cmp and { "codeium" } or nil, + }, + }, + dependencies = { + "codeium.nvim", + vim.g.ai_cmp and { "saghen/blink.compat" } or {}, + }, + }, } diff --git a/lua/lazyvim/plugins/extras/ai/copilot.lua b/lua/lazyvim/plugins/extras/ai/copilot.lua index 22ba0c64..8fb0492c 100644 --- a/lua/lazyvim/plugins/extras/ai/copilot.lua +++ b/lua/lazyvim/plugins/extras/ai/copilot.lua @@ -5,8 +5,20 @@ return { "zbirenbaum/copilot.lua", cmd = "Copilot", build = ":Copilot auth", + event = "InsertEnter", opts = { - suggestion = { enabled = false }, + suggestion = { + enabled = true, + auto_trigger = true, + keymap = { + accept = vim.g.ai_suggest_accept, + accept_word = vim.g.ai_suggest_accept_word, + accept_line = vim.g.ai_suggest_accept_line, + next = vim.g.ai_suggest_next, + prev = vim.g.ai_suggest_prev, + dismiss = vim.g.ai_suggest_clear, + }, + }, panel = { enabled = false }, filetypes = { markdown = true, @@ -55,9 +67,11 @@ return { -- copilot cmp source { "nvim-cmp", - dependencies = { + optional = true, + dependencies = { -- this will only be evaluated if nvim-cmp is enabled { "zbirenbaum/copilot-cmp", + enabled = vim.g.ai_cmp, -- only enable if wanted dependencies = "copilot.lua", opts = {}, config = function(_, opts) @@ -69,34 +83,30 @@ return { copilot_cmp._on_insert_enter({}) end, "copilot") end, + specs = { + { + "zbirenbaum/copilot.lua", + opts = { suggestion = { enabled = false } }, + }, + { + "nvim-cmp", + ---@param opts cmp.ConfigSchema + opts = function(_, opts) + table.insert(opts.sources, 1, { + name = "copilot", + group_index = 1, + priority = 100, + }) + end, + }, + }, }, }, - ---@param opts cmp.ConfigSchema - opts = function(_, opts) - table.insert(opts.sources, 1, { - name = "copilot", - group_index = 1, - priority = 100, - }) - end, }, { "saghen/blink.cmp", optional = true, - specs = { - { - "zbirenbaum/copilot.lua", - event = "InsertEnter", - opts = { - suggestion = { - enabled = true, - auto_trigger = true, - keymap = { accept = false }, - }, - }, - }, - }, opts = { windows = { ghost_text = { @@ -104,7 +114,7 @@ return { }, }, keymap = { - [""] = { + [vim.g.ai_suggest_accept] = { function(cmp) if cmp.is_in_snippet() then return cmp.accept() diff --git a/lua/lazyvim/plugins/extras/coding/blink.lua b/lua/lazyvim/plugins/extras/coding/blink.lua index eb5d5471..9c9b7be1 100644 --- a/lua/lazyvim/plugins/extras/coding/blink.lua +++ b/lua/lazyvim/plugins/extras/coding/blink.lua @@ -6,7 +6,10 @@ return { { "saghen/blink.cmp", version = "*", - opts_extend = { "sources.completion.enabled_providers" }, + opts_extend = { + "sources.completion.enabled_providers", + "sources.compat", + }, dependencies = { "rafamadriz/friendly-snippets", -- add blink.compat to dependencies @@ -45,6 +48,9 @@ return { -- experimental signature help support -- trigger = { signature_help = { enabled = true } } sources = { + -- adding any nvim-cmp sources here will enable them + -- with blink.compat + compat = {}, completion = { -- remember to enable your providers here enabled_providers = { "lsp", "path", "snippets", "buffer" }, @@ -55,6 +61,20 @@ return { preset = "enter", }, }, + ---@param opts blink.cmp.Config + config = function(_, opts) + for _, source in ipairs(opts.sources.compat or {}) do + opts.sources.providers[source] = opts.sources.providers[source] + or { + name = source, + module = "blink.compat.source", + } + if not vim.tbl_contains(opts.sources.completion.enabled_providers, source) then + table.insert(opts.sources.completion.enabled_providers, source) + end + end + require("blink.cmp").setup(opts) + end, }, -- add icons diff --git a/lua/lazyvim/util/lualine.lua b/lua/lazyvim/util/lualine.lua index db8311c4..5df789fa 100644 --- a/lua/lazyvim/util/lualine.lua +++ b/lua/lazyvim/util/lualine.lua @@ -7,7 +7,7 @@ function M.cmp_source(name, icon) if not package.loaded["cmp"] then return end - for _, s in ipairs(require("cmp").core.sources) do + for _, s in ipairs(require("cmp").core.sources or {}) do if s.name == name then if s.source:is_available() then started = true