From c236f1f4a9daf31f4004680fa505fcfe34a091a7 Mon Sep 17 00:00:00 2001 From: LUSEDOU Date: Sat, 30 Dec 2023 14:12:21 -0500 Subject: [PATCH 1/2] feat(suggestion): operate when is_visible --- lua/copilot/suggestion.lua | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lua/copilot/suggestion.lua b/lua/copilot/suggestion.lua index adea6e32..c93e923b 100644 --- a/lua/copilot/suggestion.lua +++ b/lua/copilot/suggestion.lua @@ -69,7 +69,14 @@ end local function set_keymap(keymap) if keymap.accept then - vim.keymap.set("i", keymap.accept, mod.accept, { + vim.keymap.set("i", keymap.accept, function () + if mod.is_visible() then + mod.accept() + else + local termcode = vim.api.nvim_replace_termcodes(keymap.accept, true, false, true) + vim.api.nvim_feedkeys(termcode, "n", true) + end + end, { desc = "[copilot] accept suggestion", silent = true, }) From 3b6ec7da1175b39db47d8c50c8222d4ecb4f5f71 Mon Sep 17 00:00:00 2001 From: Antoine Gaudreau Simard Date: Sat, 5 Apr 2025 10:16:54 -0400 Subject: [PATCH 2/2] WIP on master --- README.md | 2 + lua/copilot/config/suggestion.lua | 3 + lua/copilot/suggestion/init.lua | 10 ++- lua/copilot/util.lua | 1 + ...p,-no-suggestion,-execute-normal-keystroke | 23 ++++++ ...ion()---accept-keymap-to-trigger-sugestion | 23 ++++++ ...trigger-is-false,-will-not-show-ghost-test | 23 ++++++ tests/test_suggestion.lua | 79 +++++++++++++++++++ 8 files changed, 160 insertions(+), 4 deletions(-) create mode 100644 tests/screenshots/tests-test_suggestion.lua---suggestion()---accept-keymap,-no-suggestion,-execute-normal-keystroke create mode 100644 tests/screenshots/tests-test_suggestion.lua---suggestion()---accept-keymap-to-trigger-sugestion create mode 100644 tests/screenshots/tests-test_suggestion.lua---suggestion()---auto_trigger-is-false,-will-not-show-ghost-test diff --git a/README.md b/README.md index f863bc88..edd4b1c8 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,7 @@ require('copilot').setup({ auto_trigger = false, hide_during_completion = true, debounce = 75, + trigger_on_accept = true, keymap = { accept = "", accept_word = false, @@ -171,6 +172,7 @@ require("copilot.panel").refresh() When `auto_trigger` is `true`, copilot starts suggesting as soon as you enter insert mode. When `auto_trigger` is `false`, use the `next`, `prev` or `accept` keymap to trigger copilot suggestion. +When `trigger_on_accept` is `false`, the keypress will be passed to the buffer as-is, instead of triggering completion. To toggle auto trigger for the current buffer, use `require("copilot.suggestion").toggle_auto_trigger()`. diff --git a/lua/copilot/config/suggestion.lua b/lua/copilot/config/suggestion.lua index 7c719ef3..e97fde21 100644 --- a/lua/copilot/config/suggestion.lua +++ b/lua/copilot/config/suggestion.lua @@ -3,6 +3,7 @@ ---@field auto_trigger boolean Whether to trigger the suggestion automatically ---@field hide_during_completion boolean Whether to hide the suggestion during completion ---@field debounce integer Debounce time in milliseconds +---@field trigger_on_accept boolean To either trigger the suggestion on accept or pass the keystroke to the buffer ---@field keymap SuggestionKeymapConfig Keymap for the suggestion ---@class (exact) SuggestionKeymapConfig @@ -20,6 +21,7 @@ local suggestion = { auto_trigger = false, hide_during_completion = true, debounce = 15, + trigger_on_accept = true, keymap = { accept = "", accept_word = false, @@ -36,6 +38,7 @@ function suggestion.validate(config) vim.validate("auto_trigger", config.auto_trigger, "boolean") vim.validate("hide_during_completion", config.hide_during_completion, "boolean") vim.validate("debounce", config.debounce, { "number", "nil" }) + vim.validate("trigger_on_accept", config.trigger_on_accept, "boolean") vim.validate("keymap", config.keymap, "table") vim.validate("keymap.accept", config.keymap.accept, { "string", "boolean" }) vim.validate("keymap.accept_word", config.keymap.accept_word, { "string", "boolean" }) diff --git a/lua/copilot/suggestion/init.lua b/lua/copilot/suggestion/init.lua index d31a19bb..291bc251 100644 --- a/lua/copilot/suggestion/init.lua +++ b/lua/copilot/suggestion/init.lua @@ -70,9 +70,11 @@ end local function set_keymap(keymap) if keymap.accept then - vim.keymap.set("i", keymap.accept, function () - if mod.is_visible() then - mod.accept() + vim.keymap.set("i", keymap.accept, function() + local ctx = get_ctx() + -- If we trigger on accept but the suggestion has not been triggered yet, we let it go through so it does + if (config.suggestion.trigger_on_accept and not ctx.first) or M.is_visible() then + M.accept() else local termcode = vim.api.nvim_replace_termcodes(keymap.accept, true, false, true) vim.api.nvim_feedkeys(termcode, "n", true) @@ -482,7 +484,7 @@ function M.accept(modifier) logger.trace("suggestion accept", ctx) -- no suggestion request yet - if not ctx.first then + if (not ctx.first) and config.suggestion.trigger_on_accept then logger.trace("suggestion accept, not first request", ctx) schedule(ctx) return diff --git a/lua/copilot/util.lua b/lua/copilot/util.lua index 3f2d8ff3..24c151a1 100644 --- a/lua/copilot/util.lua +++ b/lua/copilot/util.lua @@ -77,6 +77,7 @@ function M.get_doc() return doc end +-- Used by copilot.cmp to watch out if moving it function M.get_doc_params(overrides) overrides = overrides or {} diff --git a/tests/screenshots/tests-test_suggestion.lua---suggestion()---accept-keymap,-no-suggestion,-execute-normal-keystroke b/tests/screenshots/tests-test_suggestion.lua---suggestion()---accept-keymap,-no-suggestion,-execute-normal-keystroke new file mode 100644 index 00000000..4a7f7b7a --- /dev/null +++ b/tests/screenshots/tests-test_suggestion.lua---suggestion()---accept-keymap,-no-suggestion,-execute-normal-keystroke @@ -0,0 +1,23 @@ +--|---------|----- +01|123 +02|456 +03|7 +04|~ +05|~ +06|~ +07|~ +08|~ +09|", "o456", "", "o7") + vim.loop.sleep(3000) + child.lua("vim.wait(0)") + + reference_screenshot(child.get_screenshot()) +end + +T["suggestion()"]["accept keymap to trigger sugestion"] = function() + child.o.lines, child.o.columns = 10, 15 + child.lua([[M.setup({ + suggestion = { + auto_trigger = false, + keymap = { + accept = "", + }, + }, + logger = { + file_log_level = vim.log.levels.TRACE, + file = "./tests/logs/test_suggestion.log", + }, + filetypes = { + ["*"] = true, + }, + })]]) + + -- look for a synchronous way to wait for engine to be up + vim.loop.sleep(500) + child.type_keys("i123", "", "o456", "", "o7", "") + vim.loop.sleep(3000) + child.lua("vim.wait(0)") + + reference_screenshot(child.get_screenshot()) +end + +T["suggestion()"]["accept keymap, no suggestion, execute normal keystroke"] = function() + child.o.lines, child.o.columns = 10, 15 + child.lua([[M.setup({ + suggestion = { + auto_trigger = false, + trigger_on_accept = false, + keymap = { + accept = "", + }, + }, + logger = { + file_log_level = vim.log.levels.TRACE, + file = "./tests/logs/test_suggestion.log", + }, + filetypes = { + ["*"] = true, + }, + })]]) + + -- look for a synchronous way to wait for engine to be up + vim.loop.sleep(500) + child.type_keys("i123", "", "o456", "", "o7", "") + vim.loop.sleep(3000) + child.lua("vim.wait(0)") + + reference_screenshot(child.get_screenshot()) +end + return T