https://github.com/barrettruth/diffs.nvim
treesitter syntax highlighting for diffs
https://github.com/barrettruth/diffs.nvim
neovim neovim-plugin treesitter vim
Last synced: 26 days ago
JSON representation
treesitter syntax highlighting for diffs
- Host: GitHub
- URL: https://github.com/barrettruth/diffs.nvim
- Owner: barrettruth
- License: mit
- Created: 2026-02-01T21:23:53.000Z (3 months ago)
- Default Branch: main
- Last Pushed: 2026-04-03T17:44:05.000Z (27 days ago)
- Last Synced: 2026-04-03T20:25:49.244Z (27 days ago)
- Topics: neovim, neovim-plugin, treesitter, vim
- Language: Lua
- Homepage:
- Size: 411 KB
- Stars: 70
- Watchers: 3
- Forks: 3
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-neovim - barrettruth/diffs.nvim - Syntax highlighting for diffs with Tree-sitter support for `vim-fugitive` and `&diff` buffers. (Git / Quickfix)
- awesome-neovim-sorted - barrettruth/diffs.nvim
README
# diffs.nvim
**Treesitter-powered Diff Syntax highlighting for Neovim**
Enhance Neovim's built-in diff mode (and much more!) with language-aware syntax
highlighting driven by treesitter.
## Features
- Treesitter syntax highlighting in
[vim-fugitive](https://github.com/tpope/vim-fugitive),
[Neogit](https://github.com/NeogitOrg/neogit), builtin `diff` filetype, and
more!
- Character-level intra-line diff highlighting (with optional
[vscode-diff](https://github.com/esmuellert/codediff.nvim) FFI backend for
word-level accuracy)
- `:Gdiff` unified diff against any revision
- `:Greview` full-repo review diff with qflist/loclist navigation
- Inline merge conflict detection, highlighting, and resolution
- gitsigns.nvim blame popup highlighting
- Email quoting/patch syntax support (`> diff ...`)
- Vim syntax fallback
- Configurable highlighiting blend & priorities
- Context-inclusive, high-accuracy highlights
## Requirements
- Neovim 0.9.0+
## Installation
Install with your package manager of choice or via
[luarocks](https://luarocks.org/modules/barrettruth/diffs.nvim):
```
luarocks install diffs.nvim
```
## Documentation
```vim
:help diffs.nvim
```
## FAQ
**Q: How do I install with lazy.nvim?**
```lua
{
'barrettruth/diffs.nvim',
init = function()
vim.g.diffs = {
...
}
end,
}
```
Do not lazy load `diffs.nvim` with `event`, `lazy`, `ft`, `config`, or `keys` to
control loading - `diffs.nvim` lazy-loads itself.
**Q: Does diffs.nvim support
[vim-fugitive](https://github.com/tpope/vim-fugitive)/[Neogit](https://github.com/NeogitOrg/neogit)/[neojj](https://github.com/NicholasZolton/neojj)/[gitsigns](https://github.com/lewis6991/gitsigns.nvim)?**
Yes. Enable integrations in your config:
```lua
vim.g.diffs = {
integrations = {
fugitive = true,
neogit = true,
neojj = true,
gitsigns = true,
}
}
```
See the documentation for more information.
## Known Limitations
- **Incomplete syntax context**: Treesitter parses each diff hunk in isolation.
Context lines within the hunk provide syntactic context for the parser. In
rare cases, hunks that start or end mid-expression may produce imperfect
highlights due to treesitter error recovery.
- **Syntax "flashing"**: `diffs.nvim` hooks into the `FileType fugitive` event
triggered by `vim-fugitive`, at which point the buffer is preliminarily
painted. The decoration provider applies highlights on the next redraw cycle,
causing a brief visual "flash".
- **Cold Start**: Treesitter grammar loading (~10ms) and query compilation
(~4ms) are one-time costs per language per Neovim session. Each language pays
this cost on first encounter, which may cause a brief stutter when a diff
containing a new language first enters the viewport.
- **Vim syntax fallback is deferred**: The vim syntax fallback (for languages
without a treesitter parser) cannot run inside the decoration provider's
redraw cycle due to Neovim's restriction on buffer mutations. Vim syntax
highlights for these hunks appear slightly delayed.
- **Conflicting diff plugins**: `diffs.nvim` may not interact well with other
plugins that modify diff highlighting. Known plugins that may conflict:
- [`diffview.nvim`](https://github.com/sindrets/diffview.nvim) - provides its
own diff highlighting and conflict resolution UI
- [`mini.diff`](https://github.com/echasnovski/mini.diff) - visualizes buffer
differences with its own highlighting system
- [`gitsigns.nvim`](https://github.com/lewis6991/gitsigns.nvim) - generally
compatible, but both plugins modifying line highlights may produce
unexpected results
- [`git-conflict.nvim`](https://github.com/akinsho/git-conflict.nvim) -
`diffs.nvim` now includes built-in conflict resolution; disable one or the
other to avoid overlap
# Acknowledgements
- [`vim-fugitive`](https://github.com/tpope/vim-fugitive)
- [@esmuellert](https://github.com/esmuellert) /
[`codediff.nvim`](https://github.com/esmuellert/codediff.nvim) - vscode-diff
algorithm FFI backend for word-level intra-line accuracy
- [`diffview.nvim`](https://github.com/sindrets/diffview.nvim)
- [`difftastic`](https://github.com/Wilfred/difftastic)
- [`mini.diff`](https://github.com/echasnovski/mini.diff)
- [`gitsigns.nvim`](https://github.com/lewis6991/gitsigns.nvim)
- [`git-conflict.nvim`](https://github.com/akinsho/git-conflict.nvim)
- [@phanen](https://github.com/phanen) - diff header highlighting, unknown
filetype fix, shebang/modeline detection, treesitter injection support,
decoration provider highlighting architecture, gitsigns blame popup
highlighting, intra-line bg visibility fix
- [@tris203](https://github.com/tris203) - support for transparent backgrounds
- [@letientai299](https://github.com/letientai299) - `diff.mnemonicPrefix`
support