1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
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 {
{
"CopilotC-Nvim/CopilotChat.nvim",
build = "make tiktoken", -- Only on MacOS or Linux
-- version = "v3.3.0",
dependencies = {
{ "nvim-lua/plenary.nvim" },
-- { "nvim-telescope/telescope.nvim" }, -- Using telescope instead of fzf-lua
},
opts = {
-- question_header = "## User ",
-- answer_header = "## Copilot ",
-- error_header = "## Error ",
prompts = prompts,
-- Turn off Claude model as it's not working well
model = "gpt-4.1",
auto_follow_cursor = false, -- Don't follow the cursor after getting response
},
config = function(_, opts)
local chat = require("CopilotChat")
local select = require("CopilotChat.select")
-- Use unnamed register for the selection
opts.selection = select.unnamed
-- local hostname = io.popen("hostname"):read("*a"):gsub("%s+", "")
-- local user = hostname or vim.env.USER or "User"
-- opts.question_header = " " .. user .. " "
-- opts.answer_header = " Copilot "
-- Override the git prompts message
opts.prompts.Commit = {
prompt =
'> #git:staged\n\nWrite commit message with commitizen convention. Write clear, informative commit messages that explain the "what" and "why" behind changes, not just the "how".',
}
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,
},
}
|