An open API service indexing awesome lists of open source software.

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

Awesome Lists containing this project

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