CodeGPT is a plugin for neovim that provides commands to interact with ChatGPT. The focus is around code related usages. So code completion, refactorings, generating docs, etc.
- Set environment variable
OPENAI_API_KEY
to your openai api key. - The plugins 'plenary' and 'nui' are also required.
Installing with packer.
use("nvim-lua/plenary.nvim")
use("MunifTanjim/nui.nvim")
use("dpayne/CodeGPT.nvim")
Installing with plugged.
Plug("nvim-lua/plenary.nvim")
Plug("MunifTanjim/nui.nvim")
Plug("dpayne/CodeGPT.nvim")
The top-level command is :Chat
. The behavior is different depending on whether text is selected and/or arguments are passed.
:Chat
with text selection will trigger thecompletion
command, ChatGPT will try to complete the selected code snippet.
:Chat some instructions
with text selection and command args will invoke thecode_edit
command. This will treat the command args as instructions on what to do with the code snippet. In the below example,:Chat refactor to use iteration
will apply the instructionrefactor to use iteration
to the selected code.
:Chat <command>
if there is only one argument and that argument matches a command, it will invoke that command with the given text selection. In the below example:Chat tests
will attempt to write units for the selected code.
:Chat hello world
without any text selection will trigger thechat
command. This will send the argumentshello world
to ChatGPT and show the results in a popup.
A full list of predefined commands are below
command | input | Description |
---|---|---|
completion | text selection | Will ask ChatGPT to complete the selected code. |
code_edit | text selection and command args | Will ask ChatGPT to apply the given instructions (the command args) to the selected code. |
explain | text selection | Will ask ChatGPT to explain the selected code. |
doc | text selection | Will ask ChatGPT to document the selected code. |
opt | text selection | Will ask ChatGPT to optimize the selected code. |
tests | text selection | Will ask ChatGPT to write unit tests for the selected code. |
chat | command args | Will pass the given command args to ChatGPT and return the response in a popup. |
The configuration option vim.g["codegpt_commands_defaults"] = {}
can be used to override command configurations. This is a lua table with a list of commands and the options you want to override.
vim.g["codegpt_commands_defaults"] = {
["completion"] = {
user_message_template = "This is a template of the message passed to chat gpt. Hello, the code snippet is {{text_selection}}."
}
The above, overrides the message template for the completion
command.
A full list of overrides
name | default | description |
---|---|---|
model | "gpt-3.5-turbo" | The model to use. |
max_tokens | 4096 | The maximum number of tokens to use including the prompt tokens. |
temperature | 0.6 | 0 -> 1, what sampling temperature to use. |
system_message_template | "" | Helps set the behavior of the assistant. |
user_message_template | "" | Instructs the assistant. |
callback_type | "replace_lines" | Controls what the plugin does with the response |
language_instructions | {} | A table of filetype => instructions. The current buffer's filetype is used in this lookup. This is useful trigger different instructions for different languages. |
Some commands have templates that use the {{language_instructions}}
macro to allow for additional instructions for specific filetypes.
vim.g["codegpt_commands_defaults"] = {
["completion"] = {
language_instructions = {
cpp = "Use trailing return type.",
},
}
}
The above adds a specific Use trailing return type.
to the command completion
for the filetype cpp
.
Custom commands can be added to the vim.g["codegpt_commands"]
configuration option to extend the available commands.
vim.g["codegpt_commands"] = {
["modernize"] = {
user_message_template = "I have the following {{language}} code: ```{{filetype}}\n{{text_selection}}```\nModernize the above code. Use current best practices. Only return the code snippet and comments. {{language_instructions}}",
language_instructions = {
cpp = "Refactor the code to use trailing return type, and the auto keyword where applicable.",
},
}
}
The above configuration adds the command :Chat modernize
that attempts modernize the selected code snippet.
The default command configuration is:
{
model = "gpt-3.5-turbo",
max_tokens = 4096,
temperature = 0.6,
number_of_choices = 1,
system_message_template = "",
user_message_template = "",
callback_type = "replace_lines",
}
-- Disables wrapping the text in the popup window. Default is true.
vim.g["codegpt_wrap_popup_text"] = false
For any command, you can override the callback type to move the completion to a popup window. An example below is for overriding the completion
command.
require("codegpt.config")
vim.g["codegpt_commands"] = {
["completion"] = {
callback_type = "code_popup",
},
}
-- Open API key and api endpoint
vim.g["codegpt_openai_api_key"] = os.getenv("OPENAI_API_KEY")
vim.g["codegpt_chat_completions_url"] = "https://api.openai.com/v1/chat/completions"
vim.g["codegpt_openai_api_provider"] = "OpenAI" -- or Azure
-- clears visual selection after completion
vim.g["codegpt_clear_visual_selection"] = true
Callback types control what to do with the response
name | Description |
---|---|
replace_lines | replaces the current lines with the response. If no text is selected it will insert the response at the cursor. |
text_popup | Will display the result in a text popup window. |
code_popup | Will display the results in a popup window with the filetype set to the filetype of the current buffer |
name | Description |
---|---|
language | Programming language of the current buffer. |
filetype | filetype of the current buffer. |
text_selection | Any selected text. |
command_args | Command arguments. |
filetype_instructions | filetype specific instructions. |
Note that CodeGPT should work without any configuration. This is an example configuration that shows some of the options available:
require("codegpt.config")
-- Override the default chat completions url, this is useful to override when testing custom commands
-- vim.g["codegpt_chat_completions_url"] = "http://127.0.0.1:800/test"
vim.g["codegpt_commands"] = {
["tests"] = {
-- Language specific instructions for java filetype
language_instructions = {
java = "Use the TestNG framework.",
},
},
["doc"] = {
-- Language specific instructions for python filetype
language_instructions = {
python = "Use the Google style docstrings."
},
-- Overrides the max tokens to be 1024
max_tokens = 1024,
},
["code_edit"] = {
-- Overrides the system message template
system_message_template = "You are {{language}} developer.",
-- Overrides the user message template
user_message_template = "I have the following {{language}} code: ```{{filetype}}\n{{text_selection}}```\nEdit the above code. {{language_instructions}}",
-- Display the response in a popup window. The popup window filetype will be the filetype of the current buffer.
callback_type = "code_popup",
},
-- Custom command
["modernize"] = {
user_message_template = "I have the following {{language}} code: ```{{filetype}}\n{{text_selection}}```\nModernize the above code. Use current best practices. Only return the code snippet and comments. {{language_instructions}}",
language_instructions = {
cpp = "Use modern C++ syntax. Use auto where possible. Do not import std. Use trailing return type. Use the c++11, c++14, c++17, and c++20 standards where applicable.",
},
}
}
- Code related usages.
- Simple.
- Easy to add custom commands.