No description
Find a file
Barrett Ruth 2e1ebdee03 feat(highlight): add treesitter context padding from disk
Problem: treesitter parses each diff hunk in isolation, so incomplete
syntax constructs at hunk boundaries (e.g., a function definition with
no body) produce ERROR nodes and drop captures.

Solution: read N lines from the on-disk file before/after each hunk and
prepend/append them as unmapped padding lines. The line_map guard in
highlight_treesitter skips extmarks for unmapped lines, so padding
provides syntax context without visual output. Controlled by
highlights.context (default 25, 0 to disable). Also applies to the vim
syntax fallback path via a leading_offset filter.
2026-02-07 13:05:53 -05:00
.github fix: remove useless ci script 2026-02-04 15:39:27 -05:00
doc feat(highlight): add treesitter context padding from disk 2026-02-07 13:05:53 -05:00
lua/diffs feat(highlight): add treesitter context padding from disk 2026-02-07 13:05:53 -05:00
plugin fix(commands): handle :e on diffs:// buffers via BufReadCmd 2026-02-06 22:21:33 -05:00
spec feat(highlight): add treesitter context padding from disk 2026-02-07 13:05:53 -05:00
.busted feat(test): testing infrastructure 2026-02-01 23:09:05 -05:00
.editorconfig feat: initial setup files 2026-02-01 16:30:24 -05:00
.gitignore feat: initial setup files 2026-02-01 16:30:24 -05:00
.luarc.json fix(ci): add jit to luarc globals for lua-language-server 2026-02-06 13:58:30 -05:00
.pre-commit-config.yaml fix: use yaml, not yml YAML file extension 2026-02-02 22:14:04 -05:00
.prettierignore feat: initial setup files 2026-02-01 16:30:24 -05:00
.prettierrc fix: use yaml, not yml YAML file extension 2026-02-02 22:14:04 -05:00
diffs.nvim-scm-1.rockspec feat: rename everything 2026-02-02 22:09:13 -05:00
LICENSE feat: initial setup files 2026-02-01 16:30:24 -05:00
README.md feat(highlight): add treesitter context padding from disk 2026-02-07 13:05:53 -05:00
selene.toml feat: initial setup files 2026-02-01 16:30:24 -05:00
stylua.toml feat: initial setup files 2026-02-01 16:30:24 -05:00
vim.toml cleanup 2026-02-02 14:06:58 -05:00

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
  • Configurable debouncing, max lines, and diff prefix concealment

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 (controlled by highlights.context, default 25). This resolves most boundary issues. Set highlights.context = 0 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 - conflict marker highlighting may overlap with diffs.nvim

Acknowledgements