diffs.nvim/README.md
Barrett Ruth a192830d8c fix(conflict): clear stale diagnostics before re-enabling
Problem: after resolving all conflicts, vim.diagnostic.enable(true)
restored diagnostics that were cached while markers were present,
showing errors like "unexpected token end" on clean code.

Solution: call vim.diagnostic.reset() before re-enabling to flush
stale results and let the LSP re-analyze the resolved buffer.
2026-02-07 19:47:45 -05:00

3.3 KiB

diffs.nvim

Syntax highlighting for diffs in Neovim

Enhance vim-fugitive and Neovim's built-in diff mode with language-aware syntax highlighting.

diffs.nvim preview

Features

  • Treesitter syntax highlighting in :Git diffs and commit views
  • Diff header highlighting (diff --git, index, ---, +++)
  • :Gdiffsplit / :Gvdiffsplit syntax through diff backgrounds
  • :Gdiff unified diff against any git revision with syntax highlighting
  • Fugitive status buffer keymaps (du/dU) for unified diffs
  • Background-only diff colors for any &diff buffer (:diffthis, vimdiff)
  • Vim syntax fallback for languages without a treesitter parser
  • Hunk header context highlighting (@@ ... @@ function foo())
  • Character-level (intra-line) diff highlighting for changed characters
  • Inline merge conflict detection, highlighting, and resolution keymaps
  • Configurable debouncing, max lines, diff prefix concealment, blend alpha, and highlight overrides

Requirements

  • Neovim 0.9.0+

Installation

Install with your package manager of choice or via luarocks:

luarocks install diffs.nvim

Documentation

:help diffs.nvim

Known Limitations

  • Incomplete syntax context: Treesitter parses each diff hunk in isolation. To improve accuracy, diffs.nvim reads lines from disk before and after each hunk for parsing context (highlights.context, enabled by default with 25 lines). This resolves most boundary issues. Set highlights.context.enabled = false to disable.

  • Syntax flashing: diffs.nvim hooks into the FileType fugitive event triggered by vim-fugitive, at which point the buffer is preliminarily painted. The buffer is then re-painted after debounce_ms milliseconds, causing an unavoidable visual "flash" even when debounce_ms = 0.

  • 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 UI
    • mini.diff - visualizes buffer differences with its own highlighting system
    • gitsigns.nvim - generally compatible, but both plugins modifying line highlights may produce unexpected results
    • git-conflict.nvim - diffs.nvim now includes built-in conflict resolution; disable one or the other to avoid overlap

Acknowledgements