## Problem Commit 0f27488 changed fugitive and neogit integrations from enabled by default to disabled by default. Users who never explicitly set these keys in their config saw no deprecation notice and silently lost integration support. The existing deprecation warning only fires for the old `filetypes` key, missing the far more common case of users who had no explicit config at all. ## Solution Add an ephemeral migration check in `init()` that emits a `vim.notify` warning at WARN level when `fugitive`, `neogit`, and `diff` (via `extra_filetypes`) are all absent from the user's config. This covers the gap between the old `filetypes` deprecation and users who relied on implicit defaults. To be removed in 0.3.0. |
||
|---|---|---|
| .github | ||
| doc | ||
| lua/diffs | ||
| plugin | ||
| spec | ||
| .busted | ||
| .editorconfig | ||
| .gitignore | ||
| .luarc.json | ||
| .pre-commit-config.yaml | ||
| .prettierignore | ||
| .prettierrc | ||
| diffs.nvim-scm-1.rockspec | ||
| flake.lock | ||
| flake.nix | ||
| LICENSE | ||
| README.md | ||
| selene.toml | ||
| stylua.toml | ||
| vim.toml | ||
diffs.nvim
Syntax highlighting for diffs in Neovim
Enhance vim-fugitive, Neogit, and Neovim's built-in diff mode with language-aware syntax highlighting.
Features
- Treesitter syntax highlighting in vim-fugitive, Neogit, and
difffiletype - Character-level intra-line diff highlighting (with optional vscode-diff FFI backend for word-level accuracy)
:Gdiffunified diff against any revision- Background-only diff colors for
&diffbuffers - Inline merge conflict detection, highlighting, and resolution
- Vim syntax fallback, configurable blend/priorities
Requirements
- Neovim 0.9.0+
Installation
Install with your package manager of choice or via luarocks:
luarocks install diffs.nvim
Documentation
:help diffs.nvim
FAQ
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.
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.nvimhooks into theFileType fugitiveevent triggered byvim-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.nvimmay 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.nvimnow includes built-in conflict resolution; disable one or the other to avoid overlap
Acknowledgements
vim-fugitive- @esmuellert /
codediff.nvim- vscode-diff algorithm FFI backend for word-level intra-line accuracy diffview.nvimdifftasticmini.diffgitsigns.nvimgit-conflict.nvim- @phanen - diff header highlighting, unknown filetype fix, shebang/modeline detection, treesitter injection support, decoration provider highlighting architecture