Neovim 的 Copilot Chat
[!注意] 插件已从 Python 重写为 Lua。请查看从版本 1 迁移到版本 2 的指南以获取更多信息。
前提条件
确保您已安装以下内容:
- Neovim 稳定版 (0.9.5) 或每日构建版。
可选:
- tiktoken_core:
sudo luarocks install --lua-version 5.1 tiktoken_core
。或者,从 lua-tiktoken 发布页面 下载预编译的二进制文件 - 您可以在 Neovim 中通过执行
:lua print(package.cpath)
检查您的 Lua 路径。将二进制文件保存为tiktoken_core.so
到给定路径中的任何一个。
对于 Arch Linux 用户,您可以从 AUR 安装
luajit-tiktoken-bin
或lua51-tiktoken-bin
!
安装
Lazy.nvim
return {
{
"CopilotC-Nvim/CopilotChat.nvim",
branch = "canary",
dependencies = {
{ "zbirenbaum/copilot.lua" }, -- 或 github/copilot.vim
{ "nvim-lua/plenary.nvim" }, -- 用于 curl, log 包装器
},
opts = {
debug = true, -- 启用调试
-- 其余配置见配置部分
},
-- 如果想懒加载,请查看命令部分的默认命令
},
}
参见 @jellydn 的配置
Vim-Plug
类似于 lazy 设置,您可以使用以下配置:
call plug#begin()
Plug 'zbirenbaum/copilot.lua'
Plug 'nvim-lua/plenary.nvim'
Plug 'CopilotC-Nvim/CopilotChat.nvim', { 'branch': 'canary' }
call plug#end()
lua << EOF
require("CopilotChat").setup {
debug = true, -- 启用调试
-- 其余配置见配置部分
}
EOF
手动安装
- 将文件放在正确的位置
mkdir -p ~/.config/nvim/pack/copilotchat/start
cd ~/.config/nvim/pack/copilotchat/start
git clone https://github.com/zbirenbaum/copilot.lua
git clone https://github.com/nvim-lua/plenary.nvim
git clone -b canary https://github.com/CopilotC-Nvim/CopilotChat.nvim
- 添加到您的配置文件(例如
~/.config/nvim/init.lua
)
require("CopilotChat").setup {
debug = true, -- 启用调试
-- 其余配置见配置部分
}
参见 @deathbeam 的配置
使用方法
命令
:CopilotChat <输入>?
- 打开聊天窗口,可选输入:CopilotChatOpen
- 打开聊天窗口:CopilotChatClose
- 关闭聊天窗口:CopilotChatToggle
- 切换聊天窗口:CopilotChatStop
- 停止当前 copilot 输出:CopilotChatReset
- 重置聊天窗口:CopilotChatSave <名称>?
- 将聊天历史保存到文件:CopilotChatLoad <名称>?
- 从文件加载聊天历史:CopilotChatDebugInfo
- 显示调试信息:CopilotChatModels
- 查看和选择可用模型。每次创建新实例时都会重置。请在init.lua
中设置您的模型以保持持久性。
来自默认提示的命令
:CopilotChatExplain
- 为活动选择编写解释,以段落形式呈现:CopilotChatReview
- 审查所选代码:CopilotChatFix
- 此代码存在问题。重写代码以修复错误:CopilotChatOptimize
- 优化所选代码以提高性能和可读性:CopilotChatDocs
- 请为选中的代码添加文档注释:CopilotChatTests
- 请为我的代码生成测试:CopilotChatFixDiagnostic
- 请协助解决文件中的以下诊断问题:CopilotChatCommit
- 按照 commitizen 约定为更改编写提交消息:CopilotChatCommitStaged
- 按照 commitizen 约定为暂存的更改编写提交消息
API
local chat = require("CopilotChat")
-- 打开聊天窗口
chat.open()
-- 使用自定义选项打开聊天窗口
chat.open({
window = {
layout = 'float',
title = '我的标题',
},
})
-- 关闭聊天窗口
chat.close()
-- 切换聊天窗口
chat.toggle()
-- 使用自定义选项切换聊天窗口
chat.toggle({
window = {
layout = 'float',
title = '我的标题',
},
})
-- 重置聊天窗口
chat.reset()
-- 提问
chat.ask("解释它是如何工作的。")
-- 使用自定义选项提问
chat.ask("解释它是如何工作的。", {
selection = require("CopilotChat.select").buffer,
})
-- 提问并对响应做些处理
chat.ask("展示一些有趣的东西", {
callback = function(response)
print("响应:", response)
end,
})
-- 获取所有可用提示(可用于 fzf/telescope 等集成)
local prompts = chat.prompts()
-- 获取最后一个 copilot 响应(也可用于集成和自定义键映射)
local response = chat.response()
-- 使用 vim.ui.select 选择提示
local actions = require("CopilotChat.actions")
-- 选择帮助操作
actions.pick(actions.help_actions())
-- 选择提示操作
actions.pick(actions.prompt_actions({
selection = require("CopilotChat.select").visual,
}))
配置
默认配置
另请参见此处:
{
debug = false, -- 启用调试日志
proxy = nil, -- [protocol://]host[:port] 使用此代理
allow_insecure = false, -- 允许不安全的服务器连接
yank_diff_register = '"', -- 允许覆盖用于复制差异的寄存器
system_prompt = prompts.COPILOT_INSTRUCTIONS, -- 使用的系统提示
model = 'gpt-4o', -- 使用的 GPT 模型,'gpt-3.5-turbo'、'gpt-4' 或 'gpt-4o'
temperature = 0.1, -- GPT 温度
question_header = '## 用户 ', -- 用户问题的标头
answer_header = '## Copilot ', -- AI 回答的标头
error_header = '## 错误 ', -- 错误的标头
separator = '───', -- 聊天中使用的分隔符
show_folds = true, -- 显示聊天中的段落折叠 show_help = true, -- 等待用户输入时显示帮助信息作为虚拟行 auto_follow_cursor = true, -- 在聊天中自动跟随光标 auto_insert_mode = false, -- 打开窗口时自动进入插入模式,如果启用了自动跟随光标则在新提示符时也会进入 clear_chat_on_new_prompt = false, -- 每次新提示时清空聊天 highlight_selection = true, -- 在聊天窗口中高亮源缓冲区的选择
context = nil, -- 要使用的默认上下文,'buffers'、'buffer'或无(可以在提示中通过@手动指定) history_path = vim.fn.stdpath('data') .. '/copilotchat_history', -- 存储历史记录的默认路径 callback = nil, -- 接收到询问响应时使用的回调函数
-- 默认选择(可视或行) selection = function(source) return select.visual(source) or select.line(source) end,
-- 默认提示 prompts = { Explain = { prompt = '/COPILOT_EXPLAIN 为活动选择编写解释,以段落文本形式。', }, Review = { prompt = '/COPILOT_REVIEW 审查所选代码。', callback = function(response, source) -- 实现见 config.lua end, }, Fix = { prompt = '/COPILOT_GENERATE 这段代码有问题。重写代码以修复错误。', }, Optimize = { prompt = '/COPILOT_GENERATE 优化所选代码以提高性能和可读性。', }, Docs = { prompt = '/COPILOT_GENERATE 请为所选内容添加文档注释。', }, Tests = { prompt = '/COPILOT_GENERATE 请为我的代码生成测试。', }, FixDiagnostic = { prompt = '请协助解决文件中的以下诊断问题:', selection = select.diagnostics, }, Commit = { prompt = '使用 commitizen 约定编写提交消息。确保标题最多50个字符,消息在72个字符处换行。将整个消息包裹在带有 gitcommit 语言的代码块中。', selection = select.gitdiff, }, CommitStaged = { prompt = '使用 commitizen 约定编写提交消息。确保标题最多50个字符,消息在72个字符处换行。将整个消息包裹在带有 gitcommit 语言的代码块中。', selection = function(source) return select.gitdiff(source, true) end, }, },
-- 默认窗口选项 window = { layout = 'vertical', -- 'vertical', 'horizontal', 'float', 'replace' width = 0.5, -- 父窗口的宽度比例,或当 > 1 时的绝对列数 height = 0.5, -- 父窗口的高度比例,或当 > 1 时的绝对行数 -- 以下选项仅适用于浮动窗口 relative = 'editor', -- 'editor', 'win', 'cursor', 'mouse' border = 'single', -- 'none', 'single', 'double', 'rounded', 'solid', 'shadow' row = nil, -- 窗口的行位置,默认居中 col = nil, -- 窗口的列位置,默认居中 title = 'Copilot Chat', -- 聊天窗口标题 footer = nil, -- 聊天窗口页脚 zindex = 1, -- 决定窗口是在其他浮动窗口之上还是之下 },
-- 默认映射
mappings = {
complete = {
detail = '使用 @
更多参考,你可以查看 @jellydn 的配置。
定义带命令和键映射的提示
这将定义一个提示,你可以在聊天中用 /MyCustomPrompt
引用,用 :CopilotChatMyCustomPrompt
调用或使用键映射 <leader>ccmc
。
它将使用可视选择作为默认选择。如果你使用 lazy.nvim
并且已经基于 Commands
进行了延迟加载,请确保在 cmd
和 keys
中分别包含提示命令和键映射。
{
prompts = {
MyCustomPrompt = {
prompt = '解释它是如何工作的。',
mapping = '<leader>ccmc',
description = '我的自定义提示描述',
selection = require('CopilotChat.select').visual,
},
},
}
引用系统或用户提示
你可以在配置或聊天中使用 /PROMPT_NAME
斜杠表示法引用系统或用户提示。
有关默认 COPILOT_
(系统)和 USER_
(用户)提示的集合,请参见这里。
{
prompts = {
MyCustomPrompt = {
prompt = '/COPILOT_EXPLAIN 解释它是如何工作的。',
},
MyCustomPrompt2 = {
prompt = '/MyCustomPrompt 包含一些额外的上下文。',
},
},
}
自定义系统提示
在传递配置时,你可以使用 system_prompt
属性定义自定义系统提示。
{
system_prompt = '你的名字是 Github Copilot,你是开发者的 AI 助手。',
prompts = {
MyCustomPromptWithCustomSystemPrompt = {
system_prompt = '你的名字是 Johny Microsoft,你不是开发者的 AI 助手。',
prompt = '解释它是如何工作的。',
},
},
}
自定义缓冲区
你可以为此插件创建的缓冲区设置本地选项:copilot-diff
、copilot-system-prompt
、copilot-user-selection
、copilot-chat
。
vim.api.nvim_create_autocmd('BufEnter', {
pattern = 'copilot-*',
callback = function()
vim.opt_local.relativenumber = true
-- C-p 打印最后一次响应
vim.keymap.set('n', '<C-p>', function()
print(require("CopilotChat").response())
end, { buffer = true, remap = true })
end
})
提示
快速与缓冲区聊天
要使用整个缓冲区内容与 Copilot 聊天,你可以在键映射中添加以下配置:
-- lazy.nvim keys
-- 与 Copilot 快速聊天
{
"<leader>ccq",
function()
local input = vim.fn.input("快速聊天: ")
if input ~= "" then
require("CopilotChat").ask(input, { selection = require("CopilotChat.select").buffer })
end
end,
desc = "CopilotChat - 快速聊天",
}
内联聊天
将窗口布局更改为 float
并相对于光标定位,使窗口看起来像内联聊天。
这将允许你与 Copilot 聊天而无需打开新窗口。
-- lazy.nvim opts
{
window = {
layout = 'float',
relative = 'cursor',
width = 1,
height = 0.4,
row = 1
}
}
Telescope 集成
需要安装 telescope.nvim 插件。
-- lazy.nvim keys
-- 使用 telescope 显示帮助操作
{
"<leader>cch",
function()
local actions = require("CopilotChat.actions")
require("CopilotChat.integrations.telescope").pick(actions.help_actions())
end,
desc = "CopilotChat - 帮助操作",
},
-- 使用 telescope 显示提示操作
{
"<leader>ccp",
function()
local actions = require("CopilotChat.actions")
require("CopilotChat.integrations.telescope").pick(actions.prompt_actions())
end,
desc = "CopilotChat - 提示操作",
},
fzf-lua 集成
需要安装 fzf-lua 插件。
-- lazy.nvim 按键设置
-- 使用 fzf-lua 显示帮助操作
{
"<leader>cch",
function()
local actions = require("CopilotChat.actions")
require("CopilotChat.integrations.fzflua").pick(actions.help_actions())
end,
desc = "CopilotChat - 帮助操作",
},
-- 使用 fzf-lua 显示提示操作
{
"<leader>ccp",
function()
local actions = require("CopilotChat.actions")
require("CopilotChat.integrations.fzflua").pick(actions.prompt_actions())
end,
desc = "CopilotChat - 提示操作",
},
nvim-cmp 集成
需要安装并正确配置 nvim-cmp 插件。
-- 注册 copilot-chat 源并为 copilot-chat 文件类型启用它(即 copilot 聊天窗口)
require("CopilotChat.integrations.cmp").setup()
-- 在执行此操作时,你可能还想禁用 copilot 聊天的默认 <tab> 补全映射
require('CopilotChat').setup({
mappings = {
complete = {
insert = '',
},
},
-- 其余配置
})
路线图(愿望清单)
- 使用带有当前工作区的索引向量数据库以获得更好的上下文选择
- 一般性的生活质量改进
开发
安装预提交工具
对于开发,你可以使用提供的 Makefile 命令来安装预提交工具:
make install-pre-commit
这将安装预提交工具和预提交钩子。
贡献者 ✨
如果你想为这个项目做出贡献,请阅读 CONTRIBUTING.md 文件。
感谢这些优秀的人(表情符号键):
本项目遵循all-contributors规范。欢迎任何形式的贡献!