Syntax highlighting for diffs in Neovim
Enhance vim-fugitive, Neogit, and Neovim's built-in diff mode with language-aware syntax highlighting.
diff filetype:Gdiff unified diff against any revision&diff buffersInstall with your package manager of choice or via luarocks:
luarocks install diffs.nvim
:help diffs.nvim
Q: How do I install with lazy.nvim?
{
'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/Neogit?
Yes. Enable it in your config:
vim.g.diffs = {
fugitive = true,
neogit = true,
}
See the documentation for more information.
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 - provides its
own diff highlighting and conflict resolution UImini.diff - visualizes buffer
differences with its own highlighting systemgitsigns.nvim - generally
compatible, but both plugins modifying line highlights may produce
unexpected resultsgit-conflict.nvim -
diffs.nvim now includes built-in conflict resolution; disable one or the
other to avoid overlapvim-fugitivecodediff.nvim - vscode-diff
algorithm FFI backend for word-level intra-line accuracydiffview.nvimdifftasticmini.diffgitsigns.nvimgit-conflict.nvim