254 lines
9.0 KiB
Lua
254 lines
9.0 KiB
Lua
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.",
|
|
Docstring = "Please use a Sphinx format to write a docstring for this object. Is very important that you respect the Sphinx format.",
|
|
-- 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 {
|
|
{
|
|
"CopilotC-Nvim/CopilotChat.nvim",
|
|
branch = "canary", -- Use the canary branch if you want to test the latest features but it might be unstable
|
|
-- version = "v2.10.0",
|
|
-- Do not use branch and version together, either use branch or version
|
|
dependencies = {
|
|
{ "zbirenbaum/copilot.lua" },
|
|
{ "nvim-lua/plenary.nvim" },
|
|
},
|
|
opts = {
|
|
model = 'gpt-4o-2024-05-13',
|
|
highlight_selection = true,
|
|
question_header = "## User ",
|
|
answer_header = "## Copilot ",
|
|
error_header = "## Error ",
|
|
prompts = prompts,
|
|
auto_follow_cursor = false, -- Don't follow the cursor after getting response
|
|
show_help = false, -- Show help in virtual text, set to true if that's 1st time using Copilot Chat
|
|
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",
|
|
register = '"',
|
|
},
|
|
-- Show the diff
|
|
show_diff = {
|
|
normal = "gmd",
|
|
},
|
|
-- Show the prompt
|
|
show_system_prompt = {
|
|
normal = "gmp",
|
|
},
|
|
-- Show the user selection
|
|
show_user_selection = {
|
|
normal = "gms",
|
|
},
|
|
-- 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
|
|
|
|
local user = vim.env.USER or "User"
|
|
user = user:sub(1, 1):upper() .. user:sub(2)
|
|
opts.question_header = " " .. user .. " "
|
|
opts.answer_header = " Copilot "
|
|
-- Override the git prompts message
|
|
opts.prompts.Commit = {
|
|
prompt = 'Write commit message with commitizen convention. Write clear, informative commit messages that explain the "what" and "why" behind changes, not just the "how". Returning the answer in portuguese.',
|
|
selection = select.gitdiff,
|
|
}
|
|
opts.prompts.CommitStaged = {
|
|
prompt = 'Write commit message with commitizen convention. Write clear, informative commit messages that explain the "what" and "why" behind changes, not just the "how". Returning the answer in portuguese.',
|
|
selection = function(source)
|
|
return select.gitdiff(source, true)
|
|
end,
|
|
}
|
|
|
|
chat.setup(opts)
|
|
-- Setup CMP integration
|
|
-- require("CopilotChat.integrations.cmp").setup()
|
|
--
|
|
-- 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 help actions
|
|
{
|
|
"<leader>ah",
|
|
function()
|
|
local actions = require("CopilotChat.actions")
|
|
require("CopilotChat.integrations.telescope").pick(actions.help_actions())
|
|
end,
|
|
desc = "CopilotChat - Help actions",
|
|
},
|
|
-- Show prompts actions
|
|
{
|
|
"<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",
|
|
},
|
|
{
|
|
"<leader>aM",
|
|
"<cmd>CopilotChatCommitStaged<cr>",
|
|
desc = "CopilotChat - Generate commit message for staged 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" },
|
|
},
|
|
},
|
|
{
|
|
"folke/edgy.nvim",
|
|
optional = true,
|
|
opts = function(_, opts)
|
|
opts.right = opts.right or {}
|
|
table.insert(opts.right, {
|
|
ft = "copilot-chat",
|
|
title = "Copilot Chat",
|
|
size = { width = 50 },
|
|
})
|
|
end,
|
|
},
|
|
}
|