ChatGPT是一个Neovim插件,可让您毫不费力地利用OpenAi Chatgpt API,使您能够直接在编辑器中从OpenAI的Chatgpt生成自然语言响应,以响应您的查询。

交互式问答:使用直觉界面与功能强大的GPT模型(CHATGPT)进行交互式问答会议。
基于角色的对话:探索各种观点,并通过从Awesome ChatGpt提示中选择提示来与不同角色进行对话。
代码编辑帮助:通过由GPT模型提供动力的交互式编辑窗口来增强您的编码体验,提供了用于编码任务的说明。
代码完成:享受与GitHub Copilot类似的代码完成的便利性,利用GPT模型的功能建议基于上下文和编程模式建议代码段和完成。
可自定义的操作:使用GPT模型执行一系列操作,例如语法校正,翻译,关键字生成,DocString创建,测试加法,代码优化,摘要,错误修复,代码说明,ROXYGEN编辑和代码可读性分析。此外,您可以使用JSON文件定义自己的自定义操作。
要全面了解扩展功能,您可以观看插件展示视频
确保已安装curl 。
从OpenAI获取API键,您可以在此处获得。 (注意:Chatgpt Plus订阅当前不包括所需的API积分。您必须单独购买API积分。)
可以通过以下两种方式之一提供OpenAI API密钥:
在“配置”选项api_key_cmd中,将路径和参数提供给通过Stdout返回API密钥的可执行文件。
通过称为$OPENAI_API_KEY的环境变量设置它。
具有配置选项api_host_cmd或称为$OPENAI_API_HOST的环境变量的自定义OpenAI API主机。如果您无法直接访问OpenAi,这很有用
可以使用配置选项extra_curl_params传递自定义卷曲参数。如果您需要在请求中包含其他标题:
{
... ,
extra_curl_params = {
" -H " ,
" Origin: https://example.com "
}
}对于Azure部署,您需要指定URL基础,引擎和API类型。您可以通过两种方式之一来完成此操作:
api_type_cmd , azure_api_base , azure_api_engine_cmd和azure_api_version_cmd 。这些中的每一个都应是返回相应值的可执行命令。例如:
local config = {
api_host_cmd = ' echo -n "" ' ,
api_key_cmd = ' pass azure-openai-key ' ,
api_type_cmd = ' echo azure ' ,
azure_api_base_cmd = ' echo https://{your-resource-name}.openai.azure.com ' ,
azure_api_engine_cmd = ' echo chat ' ,
azure_api_version_cmd = ' echo 2023-05-15 '
}
require ( " chatgpt " ). setup ( config )$OPENAI_API_TYPE , $OPENAI_API_BASE , $OPENAI_API_AZURE_ENGINE和$OPENAI_API_AZURE_VERSION 。例如:
export OPENAI_API_TYPE= " azure "
export OPENAI_API_BASE= " https://{your-resource-name}.openai.azure.com "
export OPENAI_API_AZURE_ENGINE= " chat "
export OPENAI_API_AZURE_VERSION= " 2023-05-15 "请注意,编辑模型已被弃用,并且可能无法按预期运行。
如果您使用Packer.nvim作为插件管理器:
-- Packer
use ({
" jackMort/ChatGPT.nvim " ,
config = function ()
require ( " chatgpt " ). setup ()
end ,
requires = {
" MunifTanjim/nui.nvim " ,
" nvim-lua/plenary.nvim " ,
" folke/trouble.nvim " ,
" nvim-telescope/telescope.nvim "
}
})或者,如果您使用的是懒惰:nvim:
-- Lazy
{
" jackMort/ChatGPT.nvim " ,
event = " VeryLazy " ,
config = function ()
require ( " chatgpt " ). setup ()
end ,
dependencies = {
" MunifTanjim/nui.nvim " ,
" nvim-lua/plenary.nvim " ,
" folke/trouble.nvim " , -- optional
" nvim-telescope/telescope.nvim "
}
}ChatGPT.nvim带有以下默认值,您可以通过将config作为设置参数覆盖它们
https://github.com/jackmort/chatgpt.nvim/blob/main/lua/chatgpt/config.lua
聊天模型的简单配置看起来像这样:
{
" jackMort/ChatGPT.nvim " ,
event = " VeryLazy " ,
config = function ()
require ( " chatgpt " ). setup ({
-- this config assumes you have OPENAI_API_KEY environment variable set
openai_params = {
-- NOTE: model can be a function returning the model name
-- this is useful if you want to change the model on the fly
-- using commands
-- Example:
-- model = function()
-- if some_condition() then
-- return "gpt-4-1106-preview"
-- else
-- return "gpt-3.5-turbo"
-- end
-- end,
model = " gpt-4-1106-preview " ,
frequency_penalty = 0 ,
presence_penalty = 0 ,
max_tokens = 4095 ,
temperature = 0.2 ,
top_p = 0.1 ,
n = 1 ,
}
})
end ,
dependencies = {
" MunifTanjim/nui.nvim " ,
" nvim-lua/plenary.nvim " ,
" folke/trouble.nvim " , -- optional
" nvim-telescope/telescope.nvim "
}
}通过环境变量提供OpenAI API键是危险的,因为它可以通过任何可以访问其他过程的环境变量的过程易于阅读的API密钥。此外,它鼓励用户将凭据存储在Clear-Text中,以配置文件。
作为通过OPENAI_API_KEY环境变量提供API密钥的替代方法,鼓励用户使用api_key_cmd配置选项。 api_key_cmd配置选项采用一个字符串,该字符串在启动时执行,其输出用作API密钥。
以下配置将使用1Passwords cli, op ,从OpenAI条目的credential字段获取API键。
require ( " chatgpt " ). setup ({
api_key_cmd = " op read op://private/OpenAI/credential --no-newline "
})以下配置将使用GPG解密包含API密钥的本地文件
local home = vim . fn . expand ( " $HOME " )
require ( " chatgpt " ). setup ({
api_key_cmd = " gpg --decrypt " .. home .. " /secret.txt.gpg "
})请注意, api_key_cmd参数被Whitespace拆分。如果您需要参数内的空格(例如,用空格引用路径),则可以将其包装在单独的脚本中。
插件公开以下命令:
ChatGPT ChatGPT命令使用gpt-3.5-turbo模型打开交互式窗口。 (也称为ChatGPT )
ChatGPTActAs ChatGPTActAs命令,从Awesome ChatGpt提示中打开了一个提示,将与gpt-3.5-turbo型号一起使用。

ChatGPTEditWithInstructions ChatGPTEditWithInstructions命令使用code-davinci-edit-001模型(用于编码的GPT 3.5微调)打开交互式窗口以编辑所选文本或整个窗口。
您可以使用lua api映射它,例如,使用which-key.nvim :
local chatgpt = require ( " chatgpt " )
wk . register ({
p = {
name = " ChatGPT " ,
e = {
function ()
chatgpt . edit_with_instructions ()
end ,
" Edit with instructions " ,
},
},
}, {
prefix = " <leader> " ,
mode = " v " ,
})
ChatGPTRun ChatGPTRun [action]命令运行特定操作 - 有关详细列表,请参见actions.json文件。可用操作是:
grammar_correctiontranslatekeywordsdocstringadd_testsoptimize_codesummarizefix_bugsexplain_coderoxygen_editcode_readability_analysis参见演示上述所有操作均使用gpt-3.5-turbo模型。
可以使用JSON文件定义自定义操作。有关示例,请参见actions.json 。可以在配置中设置自定义操作的路径(请参见上面的配置示例中的actions_paths字段)。
自定义操作的一个示例可能是这样的:( #标记注释)
{
"action_name" : {
"type" : "chat" , # or "completion" or "edit"
"opts" : {
"template" : "A template using possible variable: {{filetype}} (neovim filetype), {{input}} (the selected text) an {{argument}} (provided on the command line), {{filepath}} (the relative path to the file)" ,
"strategy" : "replace" , # or "display" or "append" or "edit"
"params" : { # parameters according to the official OpenAI API
"model" : "gpt-3.5-turbo" , # or any other model supported by `"type"` in the OpenAI API, use the playground for reference
"stop" : [
"```" # a string used to stop the model
]
}
},
"args" : {
"argument" : {
"type" : "strig" ,
"optional" : "true" ,
"default" : "some value"
}
}
}
} edit策略包括与输入并排显示输出,并用于进一步的编辑请求。目前,仅针对chat类型实施edit策略。
display策略显示了浮子窗口中的输出。
append并replace直接在缓冲区中修改文本。
使用ChatGPT和ChatGPTEditWithInstructions时,可用以下密钥限制:
<C-Enter> [两者]提交。<Cy> [两者]复制/缩减最后一个答案。<Co> [两个]切换设置窗口。<Ch> [两个]切换帮助窗口。<Tab> [两个]在Windows上循环。<Cf> [CHAT]在模式下循环(中心,坚持右)。<Cc> [两者]要关闭聊天窗口。<Cp> [CHAT]切换会话列表。<Cu> [聊天]滚动聊天窗口。<Cd> [聊天]向下滚动聊天窗口。<Ck> [CHAT]从最后一个答案中复制/洋基代码。<Cn> [CHAT]开始新的会话。<Cr> [CHAT]草稿消息(创建消息而不将消息提交给服务器)<Cr> [CHAT]开关角色(在用户和助手角色之间切换以定义工作流程)<Cs> [两个]切换系统消息窗口。<Ci> [编辑窗口]使用响应作为输入。<Cd> [编辑窗口]查看左右窗格之间的差异,并使用diff模式命令打开“设置窗口”(使用<Co> )时,可以通过在相关配置上按Enter进行修改设置。设置在各节中保存
将它们添加到您的whatkey插件映射中以方便绑定
c = {
name = " ChatGPT " ,
c = { " <cmd>ChatGPT<CR> " , " ChatGPT " },
e = { " <cmd>ChatGPTEditWithInstruction<CR> " , " Edit with instruction " , mode = { " n " , " v " } },
g = { " <cmd>ChatGPTRun grammar_correction<CR> " , " Grammar Correction " , mode = { " n " , " v " } },
t = { " <cmd>ChatGPTRun translate<CR> " , " Translate " , mode = { " n " , " v " } },
k = { " <cmd>ChatGPTRun keywords<CR> " , " Keywords " , mode = { " n " , " v " } },
d = { " <cmd>ChatGPTRun docstring<CR> " , " Docstring " , mode = { " n " , " v " } },
a = { " <cmd>ChatGPTRun add_tests<CR> " , " Add Tests " , mode = { " n " , " v " } },
o = { " <cmd>ChatGPTRun optimize_code<CR> " , " Optimize Code " , mode = { " n " , " v " } },
s = { " <cmd>ChatGPTRun summarize<CR> " , " Summarize " , mode = { " n " , " v " } },
f = { " <cmd>ChatGPTRun fix_bugs<CR> " , " Fix Bugs " , mode = { " n " , " v " } },
x = { " <cmd>ChatGPTRun explain_code<CR> " , " Explain Code " , mode = { " n " , " v " } },
r = { " <cmd>ChatGPTRun roxygen_edit<CR> " , " Roxygen Edit " , mode = { " n " , " v " } },
l = { " <cmd>ChatGPTRun code_readability_analysis<CR> " , " Code Readability Analysis " , mode = { " n " , " v " } },
},