Files detected via shebang or modeline (e.g., `build` with `#!/bin/bash`) weren't getting syntax highlighting because `vim.filetype.match()` only does filename-based detection. Now `get_ft_from_filename()` first checks if a buffer already exists for the file and uses its detected filetype. This requires knowing the repo root to construct the full path, so: - `parse_buffer()` reads `b:diffs_repo_root` or `b:git_dir` (fugitive) - `commands.lua` sets `b:diffs_repo_root` on diff buffers it creates Co-authored-by: phanen <phanen@qq.com> |
||
|---|---|---|
| .github | ||
| doc | ||
| lua/diffs | ||
| plugin | ||
| spec | ||
| .busted | ||
| .editorconfig | ||
| .gitignore | ||
| .luarc.json | ||
| .pre-commit-config.yaml | ||
| .prettierignore | ||
| .prettierrc | ||
| diffs.nvim-scm-1.rockspec | ||
| LICENSE | ||
| README.md | ||
| selene.toml | ||
| stylua.toml | ||
| vim.toml | ||
diffs.nvim
Syntax highlighting for diffs in Neovim
Enhance vim-fugitive and Neovim's built-in diff mode with language-aware
syntax highlighting.
Features
- Treesitter syntax highlighting in
:Gitdiffs and commit views - Diff header highlighting (
diff --git,index,---,+++) :Gdiffsplit/:Gvdiffsplitsyntax through diff backgrounds:Gdiffunified diff against any git revision with syntax highlighting- Fugitive status buffer keymaps (
du/dU) for unified diffs - Background-only diff colors for any
&diffbuffer (:diffthis,vimdiff) - Vim syntax fallback for languages without a treesitter parser
- Hunk header context highlighting (
@@ ... @@ function foo()) - 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 without surrounding code context. When a hunk shows lines added to an existing block (e.g., adding a plugin inside
return { ... }), the parser doesn't see thereturnstatement and may produce incorrect highlighting. This is inherent to parsing code fragments—no diff tooling solves this without significant complexity. -
Syntax flashing:
diffs.nvimhooks into theFileType fugitiveevent triggered byvim-fugitive, at which point the buffer is preliminarily painted. The buffer is then re-painted afterdebounce_msmilliseconds, causing an unavoidable visual "flash" even whendebounce_ms = 0. -
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- conflict marker highlighting may overlap withdiffs.nvim
Acknowledgements
vim-fugitivecodediff.nvimdiffview.nvim- @phanen - diff header highlighting