diff options
Diffstat (limited to 'lua/plugins/copilot-chat.lua')
| -rw-r--r-- | lua/plugins/copilot-chat.lua | 219 |
1 files changed, 214 insertions, 5 deletions
diff --git a/lua/plugins/copilot-chat.lua b/lua/plugins/copilot-chat.lua index 63ec0b2..0ae500d 100644 --- a/lua/plugins/copilot-chat.lua +++ b/lua/plugins/copilot-chat.lua @@ -1,15 +1,224 @@ +local IS_DEV = false + +local prompts = { + -- Code related prompts + Explain = "Please explain how the following code works.", + Review = "Please review the following code and provide suggestions for improvement.", + Tests = "Please explain how the selected code works, then generate unit tests for it.", + Refactor = "Please refactor the following code to improve its clarity and readability.", + FixCode = "Please fix the following code to make it work as intended.", + FixError = "Please explain the error in the following text and provide a solution.", + BetterNamings = "Please provide better names for the following variables and functions.", + Documentation = "Please provide documentation for the following code.", + SwaggerApiDocs = "Please provide documentation for the following API using Swagger.", + SwaggerJsDocs = "Please write JSDoc for the following API using Swagger.", + -- Text related prompts + Summarize = "Please summarize the following text.", + Spelling = "Please correct any grammar and spelling errors in the following text.", + Wording = "Please improve the grammar and wording of the following text.", + Concise = "Please rewrite the following text to make it more concise.", +} + return { + -- { import = "plugins.extras.copilot-vim" }, -- Or use { import = "lazyvim.plugins.extras.coding.copilot" }, + { + "folke/which-key.nvim", + optional = true, + opts = { + spec = { + { "<leader>a", group = "ai" }, + { "gm", group = "+Copilot chat" }, + { "gmh", desc = "Show help" }, + { "gmd", desc = "Show diff" }, + { "gmp", desc = "Show system prompt" }, + { "gms", desc = "Show selection" }, + { "gmy", desc = "Yank diff" }, + }, + }, + }, { + dir = IS_DEV and "~/Projects/research/CopilotChat.nvim" or nil, "CopilotC-Nvim/CopilotChat.nvim", - branch = "canary", + -- version = "v3.3.0", -- Use a specific version to prevent breaking changes dependencies = { + { "nvim-telescope/telescope.nvim" }, -- Use telescope for help actions + { "nvim-lua/plenary.nvim" }, { "zbirenbaum/copilot.lua" }, -- or github/copilot.vim - { "nvim-lua/plenary.nvim" }, -- for curl, log wrapper }, opts = { - debug = true, -- Enable debugging - -- See Configuration section for rest + question_header = "## User ", + answer_header = "## Copilot ", + error_header = "## Error ", + prompts = prompts, + auto_follow_cursor = false, -- Don't follow the cursor after getting response + mappings = { + -- Use tab for completion + complete = { + detail = "Use @<Tab> or /<Tab> for options.", + insert = "<Tab>", + }, + -- Close the chat + close = { + normal = "q", + insert = "<C-c>", + }, + -- Reset the chat buffer + reset = { + normal = "<C-x>", + insert = "<C-x>", + }, + -- Submit the prompt to Copilot + submit_prompt = { + normal = "<CR>", + insert = "<C-CR>", + }, + -- Accept the diff + accept_diff = { + normal = "<C-y>", + insert = "<C-y>", + }, + -- Yank the diff in the response to register + yank_diff = { + normal = "gmy", + }, + -- Show the diff + show_diff = { + normal = "gmd", + }, + -- Show the info + show_info = { + normal = "gmi", + }, + -- Show the context + show_context = { + normal = "gmc", + }, + -- Show help + show_help = { + normal = "gmh", + }, + }, + }, + config = function(_, opts) + local chat = require("CopilotChat") + local select = require("CopilotChat.select") + -- Use unnamed register for the selection + opts.selection = select.unnamed + + chat.setup(opts) + + vim.api.nvim_create_user_command("CopilotChatVisual", function(args) + chat.ask(args.args, { selection = select.visual }) + end, { nargs = "*", range = true }) + + -- Inline chat with Copilot + vim.api.nvim_create_user_command("CopilotChatInline", function(args) + chat.ask(args.args, { + selection = select.visual, + window = { + layout = "float", + relative = "cursor", + width = 1, + height = 0.4, + row = 1, + }, + }) + end, { nargs = "*", range = true }) + + -- Restore CopilotChatBuffer + vim.api.nvim_create_user_command("CopilotChatBuffer", function(args) + chat.ask(args.args, { selection = select.buffer }) + end, { nargs = "*", range = true }) + + -- Custom buffer for CopilotChat + vim.api.nvim_create_autocmd("BufEnter", { + pattern = "copilot-*", + callback = function() + vim.opt_local.relativenumber = true + vim.opt_local.number = true + + -- Get current filetype and set it to markdown if the current filetype is copilot-chat + local ft = vim.bo.filetype + if ft == "copilot-chat" then + vim.bo.filetype = "markdown" + end + end, + }) + end, + event = "VeryLazy", + keys = { + -- Show prompts actions with telescope + { + "<leader>ap", + function() + local actions = require("CopilotChat.actions") + require("CopilotChat.integrations.telescope").pick(actions.prompt_actions()) + end, + desc = "CopilotChat - Prompt actions", + }, + { + "<leader>ap", + ":lua require('CopilotChat.integrations.telescope').pick(require('CopilotChat.actions').prompt_actions({selection = require('CopilotChat.select').visual}))<CR>", + mode = "x", + desc = "CopilotChat - Prompt actions", + }, + -- Code related commands + { "<leader>ae", "<cmd>CopilotChatExplain<cr>", desc = "CopilotChat - Explain code" }, + { "<leader>at", "<cmd>CopilotChatTests<cr>", desc = "CopilotChat - Generate tests" }, + { "<leader>ar", "<cmd>CopilotChatReview<cr>", desc = "CopilotChat - Review code" }, + { "<leader>aR", "<cmd>CopilotChatRefactor<cr>", desc = "CopilotChat - Refactor code" }, + { "<leader>an", "<cmd>CopilotChatBetterNamings<cr>", desc = "CopilotChat - Better Naming" }, + -- Chat with Copilot in visual mode + { + "<leader>av", + ":CopilotChatVisual", + mode = "x", + desc = "CopilotChat - Open in vertical split", + }, + { + "<leader>ax", + ":CopilotChatInline<cr>", + mode = "x", + desc = "CopilotChat - Inline chat", + }, + -- Custom input for CopilotChat + { + "<leader>ai", + function() + local input = vim.fn.input("Ask Copilot: ") + if input ~= "" then + vim.cmd("CopilotChat " .. input) + end + end, + desc = "CopilotChat - Ask input", + }, + -- Generate commit message based on the git diff + { + "<leader>am", + "<cmd>CopilotChatCommit<cr>", + desc = "CopilotChat - Generate commit message for all changes", + }, + -- Quick chat with Copilot + { + "<leader>aq", + function() + local input = vim.fn.input("Quick Chat: ") + if input ~= "" then + vim.cmd("CopilotChatBuffer " .. input) + end + end, + desc = "CopilotChat - Quick chat", + }, + -- Debug + { "<leader>ad", "<cmd>CopilotChatDebugInfo<cr>", desc = "CopilotChat - Debug Info" }, + -- Fix the issue with diagnostic + { "<leader>af", "<cmd>CopilotChatFixDiagnostic<cr>", desc = "CopilotChat - Fix Diagnostic" }, + -- Clear buffer and chat history + { "<leader>al", "<cmd>CopilotChatReset<cr>", desc = "CopilotChat - Clear buffer and chat history" }, + -- Toggle Copilot Chat Vsplit + { "<leader>av", "<cmd>CopilotChatToggle<cr>", desc = "CopilotChat - Toggle" }, + -- Copilot Chat Models + { "<leader>a?", "<cmd>CopilotChatModels<cr>", desc = "CopilotChat - Select Models" }, }, - -- See Commands section for default commands if you want to lazy load on them }, } |