https://github.com/axkirillov/unified.nvim
an inline, unified diff viewer for neovim
https://github.com/axkirillov/unified.nvim
neovim neovim-plugin plugin
Last synced: 3 months ago
JSON representation
an inline, unified diff viewer for neovim
- Host: GitHub
- URL: https://github.com/axkirillov/unified.nvim
- Owner: axkirillov
- License: mit
- Created: 2025-03-25T08:49:24.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2026-01-15T08:46:47.000Z (3 months ago)
- Last Synced: 2026-01-15T14:55:52.344Z (3 months ago)
- Topics: neovim, neovim-plugin, plugin
- Language: Lua
- Homepage:
- Size: 266 KB
- Stars: 121
- Watchers: 1
- Forks: 8
- Open Issues: 11
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-neovim-sorted - axkirillov/unified.nvim
- awesome-neovim - axkirillov/unified.nvim - Displaying inline unified diffs directly in your buffer. (Git / Quickfix)
README
# unified.nvim
A Neovim plugin for displaying inline unified diffs directly in your buffer.

## Features
* **Inline Diffs**: View git diffs directly in your buffer, without needing a separate window.
* **File Tree Explorer**: A file tree explorer is displayed, showing all files that have been changed.
* **Git Gutter Signs**: Gutter signs are used to indicate added, modified, and deleted lines.
* **Customizable**: Configure the signs, highlights, and line symbols to your liking.
* **Auto-refresh**: The diff view automatically refreshes as you make changes to the buffer.
## Requirements
- Neovim >= 0.5.0
- Git
- A [Nerd Font](https://www.nerdfonts.com/) installed and configured in your terminal/GUI is required to display file icons correctly in the file tree.
## Installation
You can install `unified.nvim` using your favorite plugin manager.
### [lazy.nvim](https://github.com/folke/lazy.nvim)
```lua
{
'axkirillov/unified.nvim',
opts = {
-- your configuration comes here
}
}
```
### [packer.nvim](https://github.com/wbthomason/packer.nvim)
```lua
use {
'axkirillov/unified.nvim',
config = function()
require('unified').setup({
-- your configuration comes here
})
end
}
```
## Configuration
You can configure `unified.nvim` by passing a table to the `setup()` function. Here are the default settings:
```lua
require('unified').setup({
signs = {
add = "│",
delete = "│",
change = "│",
},
highlights = {
add = "DiffAdd",
delete = "DiffDelete",
change = "DiffChange",
},
line_symbols = {
add = "+",
delete = "-",
change = "~",
},
auto_refresh = true, -- Whether to automatically refresh diff when buffer changes
})
```
## Usage
1. Open a file in a git repository.
2. Make some changes to the file.
3. Run the command `:Unified` to display the diff against `HEAD` and open the file tree.
4. To close the diff view and file tree, run `:Unified` again.
5. To show the diff against a specific commit, run `:Unified `, for example `:Unified HEAD~1`.
### File Tree Interaction
When the file tree is open, you can use the following keymaps:
* `j`/`k` or ``/``: Move the cursor down/up between file nodes.
* `l`: Open the file under the cursor in the main window, displaying its diff.
* `q`: Close the file tree window.
* `R`: Refresh the file tree.
* `?`: Show a help dialog.
When the file tree opens, the first file is automatically opened in the main window.
The file tree displays the Git status of each file:
- `M`: Modified
- `A`: Added
- `D`: Deleted
- `R`: Renamed
- `C`: Copied
- `?`: Untracked
### Navigating Hunks
To navigate between hunks, you'll need to set your own keymaps:
```lua
vim.keymap.set('n', ']h', function() require('unified.navigation').next_hunk() end)
vim.keymap.set('n', '[h', function() require('unified.navigation').previous_hunk() end)
```
### Toggle API
For programmatic control, you can use the toggle function:
```lua
vim.keymap.set('n', 'ud', require('unified').toggle, { desc = 'Toggle unified diff' })
```
This toggles the diff view on/off, remembering the previous commit reference.
### Hunk actions (API)
Unified provides a function-only API for hunk actions. Define your own keymaps or commands if desired.
Example keymaps:
```lua
local actions = require('unified.hunk_actions')
vim.keymap.set('n', 'gs', actions.stage_hunk, { desc = 'Unified: Stage hunk' })
vim.keymap.set('n', 'gu', actions.unstage_hunk, { desc = 'Unified: Unstage hunk' })
vim.keymap.set('n', 'gr', actions.revert_hunk, { desc = 'Unified: Revert hunk' })
```
Behavior notes:
- Operates on the hunk under the cursor inside a regular file buffer (not in the unified file tree buffer).
- Stage: applies a minimal single-hunk patch to the index.
- Unstage: reverse-applies the hunk patch from the index.
- Revert: reverse-applies the hunk patch to the working tree.
- Binary patches are skipped with a user message.
- After an action, the inline diff and file tree are refreshed automatically.
## Commands
* `:Unified`: Toggles the diff view. If closed, it shows the diff against `HEAD`. If open, it closes the view.
* `:Unified `: Shows the diff against the specified commit reference (e.g., a commit hash, branch name, or tag) and opens the file tree for that range.
* `:Unified reset`: Removes all unified diff highlights and signs from the current buffer and closes the file tree window if it is open.
## Development
### Running Tests
To run all automated tests:
```bash
make tests
```
To run a specific test function:
```bash
make test TEST=test_file_name.test_function_name
```
## License
MIT