123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- function! gitgutter#highlight#line_disable() abort
- let g:gitgutter_highlight_lines = 0
- call s:define_sign_line_highlights()
- if !g:gitgutter_signs
- call gitgutter#sign#clear_signs(bufnr(''))
- endif
- redraw!
- endfunction
- function! gitgutter#highlight#line_enable() abort
- let old_highlight_lines = g:gitgutter_highlight_lines
- let g:gitgutter_highlight_lines = 1
- call s:define_sign_line_highlights()
- if !old_highlight_lines && !g:gitgutter_signs
- call gitgutter#all(1)
- endif
- redraw!
- endfunction
- function! gitgutter#highlight#line_toggle() abort
- if g:gitgutter_highlight_lines
- call gitgutter#highlight#line_disable()
- else
- call gitgutter#highlight#line_enable()
- endif
- endfunction
- function! gitgutter#highlight#linenr_disable() abort
- let g:gitgutter_highlight_linenrs = 0
- call s:define_sign_linenr_highlights()
- if !g:gitgutter_signs
- call gitgutter#sign#clear_signs(bufnr(''))
- endif
- redraw!
- endfunction
- function! gitgutter#highlight#linenr_enable() abort
- let old_highlight_linenrs = g:gitgutter_highlight_linenrs
- let g:gitgutter_highlight_linenrs = 1
- call s:define_sign_linenr_highlights()
- if !old_highlight_linenrs && !g:gitgutter_signs
- call gitgutter#all(1)
- endif
- redraw!
- endfunction
- function! gitgutter#highlight#linenr_toggle() abort
- if g:gitgutter_highlight_linenrs
- call gitgutter#highlight#linenr_disable()
- else
- call gitgutter#highlight#linenr_enable()
- endif
- endfunction
- function! gitgutter#highlight#define_highlights() abort
- let [guibg, ctermbg] = s:get_background_colors('SignColumn')
- " Highlights used by the signs.
- " When they are invisible.
- execute "highlight GitGutterAddInvisible guifg=bg guibg=" . guibg . " ctermfg=" . ctermbg . " ctermbg=" . ctermbg
- execute "highlight GitGutterChangeInvisible guifg=bg guibg=" . guibg . " ctermfg=" . ctermbg . " ctermbg=" . ctermbg
- execute "highlight GitGutterDeleteInvisible guifg=bg guibg=" . guibg . " ctermfg=" . ctermbg . " ctermbg=" . ctermbg
- highlight default link GitGutterChangeDeleteInvisible GitGutterChangeInvisible
- " When they are visible.
- for type in ["Add", "Change", "Delete"]
- if hlexists("GitGutter".type) && s:get_foreground_colors("GitGutter".type) != ['NONE', 'NONE']
- if g:gitgutter_set_sign_backgrounds
- execute "highlight GitGutter".type." guibg=".guibg." ctermbg=".ctermbg
- endif
- continue
- elseif s:useful_diff_colours()
- let [guifg, ctermfg] = s:get_foreground_colors('Diff'.type)
- else
- let [guifg, ctermfg] = s:get_foreground_fallback_colors(type)
- endif
- execute "highlight GitGutter".type." guifg=".guifg." guibg=".guibg." ctermfg=".ctermfg." ctermbg=".ctermbg
- endfor
- if hlexists("GitGutterChangeDelete") && g:gitgutter_set_sign_backgrounds
- execute "highlight GitGutterChangeDelete guibg=".guibg." ctermbg=".ctermbg
- endif
- highlight default link GitGutterChangeDelete GitGutterChange
- " Highlights used for the whole line.
- highlight default link GitGutterAddLine DiffAdd
- highlight default link GitGutterChangeLine DiffChange
- highlight default link GitGutterDeleteLine DiffDelete
- highlight default link GitGutterChangeDeleteLine GitGutterChangeLine
- highlight default link GitGutterAddLineNr CursorLineNr
- highlight default link GitGutterChangeLineNr CursorLineNr
- highlight default link GitGutterDeleteLineNr CursorLineNr
- highlight default link GitGutterChangeDeleteLineNr CursorLineNr
- " Highlights used intra line.
- highlight default GitGutterAddIntraLine gui=reverse cterm=reverse
- highlight default GitGutterDeleteIntraLine gui=reverse cterm=reverse
- " Set diff syntax colours (used in the preview window) - diffAdded,diffChanged,diffRemoved -
- " to match the signs, if not set aleady.
- for [dtype,type] in [['Added','Add'], ['Changed','Change'], ['Removed','Delete']]
- if !hlexists('diff'.dtype)
- let [guifg, ctermfg] = s:get_foreground_colors('GitGutter'.type)
- execute "highlight diff".dtype." guifg=".guifg." ctermfg=".ctermfg." guibg=NONE ctermbg=NONE"
- endif
- endfor
- endfunction
- function! gitgutter#highlight#define_signs() abort
- sign define GitGutterLineAdded
- sign define GitGutterLineModified
- sign define GitGutterLineRemoved
- sign define GitGutterLineRemovedFirstLine
- sign define GitGutterLineRemovedAboveAndBelow
- sign define GitGutterLineModifiedRemoved
- call s:define_sign_text()
- call gitgutter#highlight#define_sign_text_highlights()
- call s:define_sign_line_highlights()
- call s:define_sign_linenr_highlights()
- endfunction
- function! s:define_sign_text() abort
- execute "sign define GitGutterLineAdded text=" . g:gitgutter_sign_added
- execute "sign define GitGutterLineModified text=" . g:gitgutter_sign_modified
- execute "sign define GitGutterLineRemoved text=" . g:gitgutter_sign_removed
- execute "sign define GitGutterLineRemovedFirstLine text=" . g:gitgutter_sign_removed_first_line
- execute "sign define GitGutterLineRemovedAboveAndBelow text=" . g:gitgutter_sign_removed_above_and_below
- execute "sign define GitGutterLineModifiedRemoved text=" . g:gitgutter_sign_modified_removed
- endfunction
- function! gitgutter#highlight#define_sign_text_highlights() abort
- " Once a sign's text attribute has been defined, it cannot be undefined or
- " set to an empty value. So to make signs' text disappear (when toggling
- " off or disabling) we make them invisible by setting their foreground colours
- " to the background's.
- if g:gitgutter_signs
- sign define GitGutterLineAdded texthl=GitGutterAdd
- sign define GitGutterLineModified texthl=GitGutterChange
- sign define GitGutterLineRemoved texthl=GitGutterDelete
- sign define GitGutterLineRemovedFirstLine texthl=GitGutterDelete
- sign define GitGutterLineRemovedAboveAndBelow texthl=GitGutterDelete
- sign define GitGutterLineModifiedRemoved texthl=GitGutterChangeDelete
- else
- sign define GitGutterLineAdded texthl=GitGutterAddInvisible
- sign define GitGutterLineModified texthl=GitGutterChangeInvisible
- sign define GitGutterLineRemoved texthl=GitGutterDeleteInvisible
- sign define GitGutterLineRemovedFirstLine texthl=GitGutterDeleteInvisible
- sign define GitGutterLineRemovedAboveAndBelow texthl=GitGutterDeleteInvisible
- sign define GitGutterLineModifiedRemoved texthl=GitGutterChangeDeleteInvisible
- endif
- endfunction
- function! s:define_sign_line_highlights() abort
- if g:gitgutter_highlight_lines
- sign define GitGutterLineAdded linehl=GitGutterAddLine
- sign define GitGutterLineModified linehl=GitGutterChangeLine
- sign define GitGutterLineRemoved linehl=GitGutterDeleteLine
- sign define GitGutterLineRemovedFirstLine linehl=GitGutterDeleteLine
- sign define GitGutterLineRemovedAboveAndBelow linehl=GitGutterDeleteLine
- sign define GitGutterLineModifiedRemoved linehl=GitGutterChangeDeleteLine
- else
- sign define GitGutterLineAdded linehl=NONE
- sign define GitGutterLineModified linehl=NONE
- sign define GitGutterLineRemoved linehl=NONE
- sign define GitGutterLineRemovedFirstLine linehl=NONE
- sign define GitGutterLineRemovedAboveAndBelow linehl=NONE
- sign define GitGutterLineModifiedRemoved linehl=NONE
- endif
- endfunction
- function! s:define_sign_linenr_highlights() abort
- if has('nvim-0.3.2')
- try
- if g:gitgutter_highlight_linenrs
- sign define GitGutterLineAdded numhl=GitGutterAddLineNr
- sign define GitGutterLineModified numhl=GitGutterChangeLineNr
- sign define GitGutterLineRemoved numhl=GitGutterDeleteLineNr
- sign define GitGutterLineRemovedFirstLine numhl=GitGutterDeleteLineNr
- sign define GitGutterLineRemovedAboveAndBelow numhl=GitGutterDeleteLineNr
- sign define GitGutterLineModifiedRemoved numhl=GitGutterChangeDeleteLineNr
- else
- sign define GitGutterLineAdded numhl=NONE
- sign define GitGutterLineModified numhl=NONE
- sign define GitGutterLineRemoved numhl=NONE
- sign define GitGutterLineRemovedFirstLine numhl=NONE
- sign define GitGutterLineRemovedAboveAndBelow numhl=NONE
- sign define GitGutterLineModifiedRemoved numhl=NONE
- endif
- catch /E475/
- endtry
- endif
- endfunction
- function! s:get_hl(group, what, mode) abort
- let r = synIDattr(synIDtrans(hlID(a:group)), a:what, a:mode)
- if empty(r) || r == -1
- return 'NONE'
- endif
- return r
- endfunction
- function! s:get_foreground_colors(group) abort
- let ctermfg = s:get_hl(a:group, 'fg', 'cterm')
- let guifg = s:get_hl(a:group, 'fg', 'gui')
- return [guifg, ctermfg]
- endfunction
- function! s:get_background_colors(group) abort
- let ctermbg = s:get_hl(a:group, 'bg', 'cterm')
- let guibg = s:get_hl(a:group, 'bg', 'gui')
- return [guibg, ctermbg]
- endfunction
- function! s:useful_diff_colours()
- let [guifg_add, ctermfg_add] = s:get_foreground_colors('DiffAdd')
- let [guifg_del, ctermfg_del] = s:get_foreground_colors('DiffDelete')
- return guifg_add != guifg_del && ctermfg_add != ctermfg_del
- endfunction
- function! s:get_foreground_fallback_colors(type)
- if a:type == 'Add'
- return ['#009900', '2']
- elseif a:type == 'Change'
- return ['#bbbb00', '3']
- elseif a:type == 'Delete'
- return ['#ff2222', '1']
- endif
- endfunction
|