word_diff bg highlight overridden by linehl bg
Description
If linehl groups (AddLn, ChangeLn, DeleteLn) have a bg assigned to them, it prevents the bg of a word_diff highlight group (AddLnInline, ChangeLnInline, DeleteLnInline) from showing up.
Neovim version
NVIM v0.8.2 Build type: Release LuaJIT 2.1.0-beta3 Compiled by _nixbld0 Features: +acl +iconv +tui See ":help feature-compile"
Operating system and version
Linux & Darwin
Expected behavior
Word diff highlight groups should have a higher priority since they highlight within the line
Actual behavior
The word_diff highlight bg disappears when linehl is enabled and it's highlights have a bg color
Relevant HL groups in demo:
:hi GitSignsChangeLn | hi GitSignsAddLnInline | hi GitSignsChangeLnInline
GitSignsChangeLn xxx guibg=#3b4252
GitSignsAddLnInline xxx guibg=#a3be8c
GitSignsChangeLnInline xxx guibg=#ebcb8b
See below:

Minimal config
vim.o.packpath = '/tmp/nvim/site'
local plugins = {
gitsigns = 'https://github.com/lewis6991/gitsigns.nvim',
-- ADD OTHER PLUGINS _NECESSARY_ TO REPRODUCE THE ISSUE
}
for name, url in pairs(plugins) do
local install_path = '/tmp/nvim/site/pack/test/start/'..name
if vim.fn.isdirectory(install_path) == 0 then
vim.fn.system { 'git', 'clone', '--depth=1', url, install_path }
end
end
require('gitsigns').setup{
debug_mode = true, -- You must add this to enable debug messages
linehl = true,
numhl = true,
word_diff = true,
}
Steps to reproduce
- Add a bg color to the
linehlhighlight groups - Add a bg color the
word_diffhighlight groups - Enable
word_diffand see the proper coloring - Enable
linehland see the word_diff coloring dissapear
Gitsigns debug messages
:Gitsigns debug_messages signs.init: Using vimfn signs run_job: git --no-pager --literal-pathspecs -c gc.auto=0 --version fn: Highlight GitSignsAdd is already defined fn: Highlight GitSignsChange is already defined fn: Highlight GitSignsDelete is already defined derive: Deriving GitSignsChangedelete from GitSignsChange derive: Deriving GitSignsTopdelete from GitSignsDelete derive: Deriving GitSignsUntracked from GitSignsAdd fn: Highlight GitSignsAddNr is already defined fn: Highlight GitSignsChangeNr is already defined fn: Highlight GitSignsDeleteNr is already defined derive: Deriving GitSignsChangedeleteNr from GitSignsChangeNr derive: Deriving GitSignsTopdeleteNr from GitSignsDeleteNr derive: Deriving GitSignsUntrackedNr from GitSignsAddNr fn: Highlight GitSignsAddLn is already defined fn: Highlight GitSignsChangeLn is already defined derive: Deriving GitSignsChangedeleteLn from GitSignsChangeLn derive: Deriving GitSignsUntrackedLn from GitSignsAddLn derive: Deriving GitSignsStagedAdd from GitSignsAdd derive: Deriving GitSignsStagedChange from GitSignsChange derive: Deriving GitSignsStagedDelete from GitSignsDelete derive: Deriving GitSignsStagedChangedelete from GitSignsChangedelete derive: Deriving GitSignsStagedTopdelete from GitSignsTopdelete derive: Deriving GitSignsStagedAddNr from GitSignsAddNr derive: Deriving GitSignsStagedChangeNr from GitSignsChangeNr derive: Deriving GitSignsStagedDeleteNr from GitSignsDeleteNr derive: Deriving GitSignsStagedChangedeleteNr from GitSignsChangedeleteNr derive: Deriving GitSignsStagedTopdeleteNr from GitSignsTopdeleteNr derive: Deriving GitSignsStagedAddLn from GitSignsAddLn derive: Deriving GitSignsStagedChangeLn from GitSignsChangeLn derive: Deriving GitSignsStagedDeleteLn from GitSignsDeleteLn derive: Deriving GitSignsStagedChangedeleteLn from GitSignsChangedeleteLn derive: Could not derive GitSignsStagedTopdeleteLn derive: Deriving GitSignsAddPreview from DiffAdd derive: Deriving GitSignsDeletePreview from DiffDelete fn: Highlight GitSignsCurrentLineBlame is already defined derive: Deriving GitSignsAddInline from TermCursor derive: Deriving GitSignsDeleteInline from TermCursor derive: Deriving GitSignsChangeInline from TermCursor fn: Highlight GitSignsAddLnInline is already defined fn: Highlight GitSignsChangeLnInline is already defined fn: Highlight GitSignsDeleteLnInline is already defined derive: Deriving GitSignsDeleteVirtLn from DiffDelete derive: Deriving GitSignsDeleteVirtLnInLine from GitSignsDeleteLnInline run_job: git --no-pager --literal-pathspecs -c gc.auto=0 rev-parse --show-toplevel --absolute-git-dir --abbrev-ref HEAD attach(7): Attaching (trigger=BufRead) run_job: git --no-pager --literal-pathspecs -c gc.auto=0 config user.name run_job: git --no-pager --literal-pathspecs -c gc.auto=0 rev-parse --show-toplevel --absolute-git-dir --abbrev-ref HEAD run_job: git --no-pager --literal-pathspecs -c gc.auto=0 --git-dir /Users/tarkah/dotfiles/.git/modules/nvim --work-tree /Users/tarkah/dotfiles/nvim -c core.quotepath=off ls-files --st age --others --exclude-standard --eol /Users/tarkah/dotfiles/nvim/plugins/gitsigns-nvim.lua watch_gitdir(7): Watching git dir run_job: git --no-pager --literal-pathspecs -c gc.auto=0 --git-dir /Users/tarkah/dotfiles/.git/modules/nvim --work-tree /Users/tarkah/dotfiles/nvim show :0:plugins/gitsigns-nvim.lua update(7): updates: 1, jobs: 6 : Running action 'toggle_linehl' with arguments {} setup_highlights: Highlight GitSignsAdd is already defined setup_highlights: Highlight GitSignsChange is already defined setup_highlights: Highlight GitSignsDelete is already defined setup_highlights: Highlight GitSignsChangedelete is already defined setup_highlights: Highlight GitSignsTopdelete is already defined setup_highlights: Highlight GitSignsUntracked is already defined setup_highlights: Highlight GitSignsAddNr is already defined setup_highlights: Highlight GitSignsChangeNr is already defined setup_highlights: Highlight GitSignsDeleteNr is already defined setup_highlights: Highlight GitSignsChangedeleteNr is already defined setup_highlights: Highlight GitSignsTopdeleteNr is already defined setup_highlights: Highlight GitSignsUntrackedNr is already defined setup_highlights: Highlight GitSignsAddLn is already defined setup_highlights: Highlight GitSignsChangeLn is already defined setup_highlights: Highlight GitSignsChangedeleteLn is already defined setup_highlights: Highlight GitSignsUntrackedLn is already defined setup_highlights: Highlight GitSignsStagedAdd is already defined setup_highlights: Highlight GitSignsStagedChange is already defined setup_highlights: Highlight GitSignsStagedDelete is already defined setup_highlights: Highlight GitSignsStagedChangedelete is already defined setup_highlights: Highlight GitSignsStagedTopdelete is already defined setup_highlights: Highlight GitSignsStagedAddNr is already defined setup_highlights: Highlight GitSignsStagedChangeNr is already defined setup_highlights: Highlight GitSignsStagedDeleteNr is already defined setup_highlights: Highlight GitSignsStagedChangedeleteNr is already defined setup_highlights: Highlight GitSignsStagedTopdeleteNr is already defined setup_highlights: Highlight GitSignsStagedAddLn is already defined setup_highlights: Highlight GitSignsStagedChangeLn is already defined setup_highlights: Highlight GitSignsStagedDeleteLn is already defined setup_highlights: Highlight GitSignsStagedChangedeleteLn is already defined derive: Could not derive GitSignsStagedTopdeleteLn setup_highlights: Highlight GitSignsAddPreview is already defined setup_highlights: Highlight GitSignsDeletePreview is already defined setup_highlights: Highlight GitSignsCurrentLineBlame is already defined setup_highlights: Highlight GitSignsAddInline is already defined setup_highlights: Highlight GitSignsDeleteInline is already defined setup_highlights: Highlight GitSignsChangeInline is already defined setup_highlights: Highlight GitSignsAddLnInline is already defined setup_highlights: Highlight GitSignsChangeLnInline is already defined setup_highlights: Highlight GitSignsDeleteLnInline is already defined setup_highlights: Highlight GitSignsDeleteVirtLn is already defined setup_highlights: Highlight GitSignsDeleteVirtLnInLine is already defined run_job: git --no-pager --literal-pathspecs -c gc.auto=0 --git-dir /Users/tarkah/dotfiles/.git/modules/nvim --work-tree /Users/tarkah/dotfiles/nvim show :0:plugins/gitsigns-nvim.lua update(7): updates: 2, jobs: 7 : Running action 'toggle_word_diff' with arguments {} : Running action 'toggle_word_diff' with arguments {} : Running action 'toggle_linehl' with arguments {} setup_highlights: Highlight GitSignsAdd is already defined setup_highlights: Highlight GitSignsChange is already defined setup_highlights: Highlight GitSignsDelete is already defined setup_highlights: Highlight GitSignsChangedelete is already defined setup_highlights: Highlight GitSignsTopdelete is already defined setup_highlights: Highlight GitSignsUntracked is already defined setup_highlights: Highlight GitSignsAddNr is already defined setup_highlights: Highlight GitSignsChangeNr is already defined setup_highlights: Highlight GitSignsDeleteNr is already defined setup_highlights: Highlight GitSignsChangedeleteNr is already defined setup_highlights: Highlight GitSignsTopdeleteNr is already defined setup_highlights: Highlight GitSignsUntrackedNr is already defined setup_highlights: Highlight GitSignsAddLn is already defined setup_highlights: Highlight GitSignsChangeLn is already defined setup_highlights: Highlight GitSignsChangedeleteLn is already defined setup_highlights: Highlight GitSignsUntrackedLn is already defined setup_highlights: Highlight GitSignsStagedAdd is already defined setup_highlights: Highlight GitSignsStagedChange is already defined setup_highlights: Highlight GitSignsStagedDelete is already defined setup_highlights: Highlight GitSignsStagedChangedelete is already defined setup_highlights: Highlight GitSignsStagedTopdelete is already defined setup_highlights: Highlight GitSignsStagedAddNr is already defined setup_highlights: Highlight GitSignsStagedChangeNr is already defined setup_highlights: Highlight GitSignsStagedDeleteNr is already defined setup_highlights: Highlight GitSignsStagedChangedeleteNr is already defined setup_highlights: Highlight GitSignsStagedTopdeleteNr is already defined setup_highlights: Highlight GitSignsStagedAddLn is already defined setup_highlights: Highlight GitSignsStagedChangeLn is already defined setup_highlights: Highlight GitSignsStagedDeleteLn is already defined setup_highlights: Highlight GitSignsStagedChangedeleteLn is already defined derive: Could not derive GitSignsStagedTopdeleteLn setup_highlights: Highlight GitSignsAddPreview is already defined setup_highlights: Highlight GitSignsDeletePreview is already defined setup_highlights: Highlight GitSignsCurrentLineBlame is already defined setup_highlights: Highlight GitSignsAddInline is already defined setup_highlights: Highlight GitSignsDeleteInline is already defined setup_highlights: Highlight GitSignsChangeInline is already defined setup_highlights: Highlight GitSignsAddLnInline is already defined setup_highlights: Highlight GitSignsChangeLnInline is already defined setup_highlights: Highlight GitSignsDeleteLnInline is already defined setup_highlights: Highlight GitSignsDeleteVirtLn is already defined setup_highlights: Highlight GitSignsDeleteVirtLnInLine is already defined run_job: git --no-pager --literal-pathspecs -c gc.auto=0 --git-dir /Users/tarkah/dotfiles/.git/modules/nvim --work-tree /Users/tarkah/dotfiles/nvim show :0:plugins/gitsigns-nvim.lua update(7): updates: 3, jobs: 8 : Running action 'debug_messages' with arguments {} : Running action 'dump_cache' with arguments {} : Running action 'debug_messages' with arguments {}
Wow, I have been strugglng with this bug the past few months, and I just now realized it was the word_diff highlight bug causing this.
Are there any workarounds? 🙏
No, this is how Neovim works.
Are there any workarounds? 🙏
Not any that I know of, tbh I have just disabled the word_diff option altogether, its just easier not dealing with it at all.
Same issue as #1115. Upstream issue not worth fixing here.
A ad-hoc patch: https://github.com/shaobosong/gitsigns.nvim/commit/87b662f688e8a67287e7516f277386ea9abb5c49