Mai Pull Request is a Neovim plugin that helps you generate commit messages and pull requests directly from your Neovim editor.
- Create pull requests from within Neovim
- View diffs of staged files
- Integrates with OpenAI for PR description & commit message generation
- Neovim >= 0.7.0
- Git (installed and configured in your system)
- OpenAI API key (for PR description generation)
Using lazy.nvim
Add the following to your Neovim configuration:
{
"ryanvu/mai_pr.nvim",
config = function()
require("mai_pull_request").setup({
-- your configuration here
})
end,
dependencies = {
"MunifTanjim/nui.nvim",
},
}
You can configure Mai Pull Request by passing options to the setup
function:
require("mai_pull_request").setup({
api_key = "your-openai-api-key", -- Set your OpenAI API key here
create_commands = true, -- Set to false if you don't want to create commands
model = "gpt-4o-mini", -- OpenAI model to use
max_tokens = 4096, -- Maximum number of tokens for OpenAI requests
temperature = 0.5, -- Temperature for OpenAI requests
verbose_commit = false, -- Defaults to have non-verbose one-liner commit messages
})
After installation and configuration, you can use the following commands:
:MaiPR
: Create a new pull request for the current branch:MaiDiffToCommit
: View the diff for the current branch:MaiDiffBetweenBranches <base_branch> <branch>
: View the diff between two branches
The plugin sets up the following default keymaps:
<leader>pr
: Create a new pull request (equivalent to:MaiPR
)<leader>vd
: View diff to commit (equivalent to:MaiDiffToCommit
)
You can customize these keymaps in your Neovim configuration if desired.
Generated commit message
![View Diff](https://private-user-images.githubusercontent.com/13227428/374796266-3f29a2ea-4314-404f-9145-35c142276dc0.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxOTEzMzMsIm5iZiI6MTczOTE5MTAzMywicGF0aCI6Ii8xMzIyNzQyOC8zNzQ3OTYyNjYtM2YyOWEyZWEtNDMxNC00MDRmLTkxNDUtMzVjMTQyMjc2ZGMwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEwVDEyMzcxM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWE5MDdhMjQzYjg4YjhlYWY1MGNkNDZjOWVjODMyYTA3NjllNGNlZjc2MGQzZWNiYWNiY2U4YThjZTQ5ZDQ3NTQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.Zss_3ik6LnOU443cilCx6IRyYbIn4hHUfYd_WJHtMLs)
Diff between branches
![Diff Branch Selection](https://private-user-images.githubusercontent.com/13227428/374796273-b5ad04da-6ccb-41f5-b04d-42f9b638d01b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxOTEzMzMsIm5iZiI6MTczOTE5MTAzMywicGF0aCI6Ii8xMzIyNzQyOC8zNzQ3OTYyNzMtYjVhZDA0ZGEtNmNjYi00MWY1LWIwNGQtNDJmOWI2MzhkMDFiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEwVDEyMzcxM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTQ3NjIyNGJjOWU5YjRjNjAxYWE3MTQ4MDIzMTExMzUyMWE3NGZiNWQ3YzU0ZTBhMDcyZmJlMmU1NDJhOGIyMTUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.y0qePkKKqEZi99n0Ir1XTWsXsFhsiUIIj9K4SAUF4CM)
Generated PR
![Generated PR](https://private-user-images.githubusercontent.com/13227428/374796279-0e709595-8266-49b6-bb8f-195429ca3d37.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxOTEzMzMsIm5iZiI6MTczOTE5MTAzMywicGF0aCI6Ii8xMzIyNzQyOC8zNzQ3OTYyNzktMGU3MDk1OTUtODI2Ni00OWI2LWJiOGYtMTk1NDI5Y2EzZDM3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEwVDEyMzcxM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTIyMzkwNjI3NDdjOGE0ZWY3ZjAxNjRkNjVmYzA4OTc4ZTRjZDM2OGFiYTJhZTc4MWY4ZTQ3Y2E0YTU0ZmMwM2ImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.BJd7cslcL9KQl_6eXz9Osya6GPu6twDCKF6f2-FrIBk)
If you prefer not to store your OpenAI API key in your configuration, you can set it as an environment variable:
export OPEN_AI_API_KEY=your-api-key-here
Contributions are welcome! Please feel free to submit a Pull Request.
If you encounter any problems or have any questions, please open an issue on the GitHub repository.