highlight.vim 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. function! gitgutter#highlight#line_disable() abort
  2. let g:gitgutter_highlight_lines = 0
  3. call s:define_sign_line_highlights()
  4. if !g:gitgutter_signs
  5. call gitgutter#sign#clear_signs(bufnr(''))
  6. endif
  7. redraw!
  8. endfunction
  9. function! gitgutter#highlight#line_enable() abort
  10. let old_highlight_lines = g:gitgutter_highlight_lines
  11. let g:gitgutter_highlight_lines = 1
  12. call s:define_sign_line_highlights()
  13. if !old_highlight_lines && !g:gitgutter_signs
  14. call gitgutter#all(1)
  15. endif
  16. redraw!
  17. endfunction
  18. function! gitgutter#highlight#line_toggle() abort
  19. if g:gitgutter_highlight_lines
  20. call gitgutter#highlight#line_disable()
  21. else
  22. call gitgutter#highlight#line_enable()
  23. endif
  24. endfunction
  25. function! gitgutter#highlight#linenr_disable() abort
  26. let g:gitgutter_highlight_linenrs = 0
  27. call s:define_sign_linenr_highlights()
  28. if !g:gitgutter_signs
  29. call gitgutter#sign#clear_signs(bufnr(''))
  30. endif
  31. redraw!
  32. endfunction
  33. function! gitgutter#highlight#linenr_enable() abort
  34. let old_highlight_linenrs = g:gitgutter_highlight_linenrs
  35. let g:gitgutter_highlight_linenrs = 1
  36. call s:define_sign_linenr_highlights()
  37. if !old_highlight_linenrs && !g:gitgutter_signs
  38. call gitgutter#all(1)
  39. endif
  40. redraw!
  41. endfunction
  42. function! gitgutter#highlight#linenr_toggle() abort
  43. if g:gitgutter_highlight_linenrs
  44. call gitgutter#highlight#linenr_disable()
  45. else
  46. call gitgutter#highlight#linenr_enable()
  47. endif
  48. endfunction
  49. function! gitgutter#highlight#define_highlights() abort
  50. let [guibg, ctermbg] = s:get_background_colors('SignColumn')
  51. " Highlights used by the signs.
  52. " When they are invisible.
  53. execute "highlight GitGutterAddInvisible guifg=bg guibg=" . guibg . " ctermfg=" . ctermbg . " ctermbg=" . ctermbg
  54. execute "highlight GitGutterChangeInvisible guifg=bg guibg=" . guibg . " ctermfg=" . ctermbg . " ctermbg=" . ctermbg
  55. execute "highlight GitGutterDeleteInvisible guifg=bg guibg=" . guibg . " ctermfg=" . ctermbg . " ctermbg=" . ctermbg
  56. highlight default link GitGutterChangeDeleteInvisible GitGutterChangeInvisible
  57. " When they are visible.
  58. for type in ["Add", "Change", "Delete"]
  59. if hlexists("GitGutter".type) && s:get_foreground_colors("GitGutter".type) != ['NONE', 'NONE']
  60. if g:gitgutter_set_sign_backgrounds
  61. execute "highlight GitGutter".type." guibg=".guibg." ctermbg=".ctermbg
  62. endif
  63. continue
  64. elseif s:useful_diff_colours()
  65. let [guifg, ctermfg] = s:get_foreground_colors('Diff'.type)
  66. else
  67. let [guifg, ctermfg] = s:get_foreground_fallback_colors(type)
  68. endif
  69. execute "highlight GitGutter".type." guifg=".guifg." guibg=".guibg." ctermfg=".ctermfg." ctermbg=".ctermbg
  70. endfor
  71. if hlexists("GitGutterChangeDelete") && g:gitgutter_set_sign_backgrounds
  72. execute "highlight GitGutterChangeDelete guibg=".guibg." ctermbg=".ctermbg
  73. endif
  74. highlight default link GitGutterChangeDelete GitGutterChange
  75. " Highlights used for the whole line.
  76. highlight default link GitGutterAddLine DiffAdd
  77. highlight default link GitGutterChangeLine DiffChange
  78. highlight default link GitGutterDeleteLine DiffDelete
  79. highlight default link GitGutterChangeDeleteLine GitGutterChangeLine
  80. highlight default link GitGutterAddLineNr CursorLineNr
  81. highlight default link GitGutterChangeLineNr CursorLineNr
  82. highlight default link GitGutterDeleteLineNr CursorLineNr
  83. highlight default link GitGutterChangeDeleteLineNr CursorLineNr
  84. " Highlights used intra line.
  85. highlight default GitGutterAddIntraLine gui=reverse cterm=reverse
  86. highlight default GitGutterDeleteIntraLine gui=reverse cterm=reverse
  87. " Set diff syntax colours (used in the preview window) - diffAdded,diffChanged,diffRemoved -
  88. " to match the signs, if not set aleady.
  89. for [dtype,type] in [['Added','Add'], ['Changed','Change'], ['Removed','Delete']]
  90. if !hlexists('diff'.dtype)
  91. let [guifg, ctermfg] = s:get_foreground_colors('GitGutter'.type)
  92. execute "highlight diff".dtype." guifg=".guifg." ctermfg=".ctermfg." guibg=NONE ctermbg=NONE"
  93. endif
  94. endfor
  95. endfunction
  96. function! gitgutter#highlight#define_signs() abort
  97. sign define GitGutterLineAdded
  98. sign define GitGutterLineModified
  99. sign define GitGutterLineRemoved
  100. sign define GitGutterLineRemovedFirstLine
  101. sign define GitGutterLineRemovedAboveAndBelow
  102. sign define GitGutterLineModifiedRemoved
  103. call s:define_sign_text()
  104. call gitgutter#highlight#define_sign_text_highlights()
  105. call s:define_sign_line_highlights()
  106. call s:define_sign_linenr_highlights()
  107. endfunction
  108. function! s:define_sign_text() abort
  109. execute "sign define GitGutterLineAdded text=" . g:gitgutter_sign_added
  110. execute "sign define GitGutterLineModified text=" . g:gitgutter_sign_modified
  111. execute "sign define GitGutterLineRemoved text=" . g:gitgutter_sign_removed
  112. execute "sign define GitGutterLineRemovedFirstLine text=" . g:gitgutter_sign_removed_first_line
  113. execute "sign define GitGutterLineRemovedAboveAndBelow text=" . g:gitgutter_sign_removed_above_and_below
  114. execute "sign define GitGutterLineModifiedRemoved text=" . g:gitgutter_sign_modified_removed
  115. endfunction
  116. function! gitgutter#highlight#define_sign_text_highlights() abort
  117. " Once a sign's text attribute has been defined, it cannot be undefined or
  118. " set to an empty value. So to make signs' text disappear (when toggling
  119. " off or disabling) we make them invisible by setting their foreground colours
  120. " to the background's.
  121. if g:gitgutter_signs
  122. sign define GitGutterLineAdded texthl=GitGutterAdd
  123. sign define GitGutterLineModified texthl=GitGutterChange
  124. sign define GitGutterLineRemoved texthl=GitGutterDelete
  125. sign define GitGutterLineRemovedFirstLine texthl=GitGutterDelete
  126. sign define GitGutterLineRemovedAboveAndBelow texthl=GitGutterDelete
  127. sign define GitGutterLineModifiedRemoved texthl=GitGutterChangeDelete
  128. else
  129. sign define GitGutterLineAdded texthl=GitGutterAddInvisible
  130. sign define GitGutterLineModified texthl=GitGutterChangeInvisible
  131. sign define GitGutterLineRemoved texthl=GitGutterDeleteInvisible
  132. sign define GitGutterLineRemovedFirstLine texthl=GitGutterDeleteInvisible
  133. sign define GitGutterLineRemovedAboveAndBelow texthl=GitGutterDeleteInvisible
  134. sign define GitGutterLineModifiedRemoved texthl=GitGutterChangeDeleteInvisible
  135. endif
  136. endfunction
  137. function! s:define_sign_line_highlights() abort
  138. if g:gitgutter_highlight_lines
  139. sign define GitGutterLineAdded linehl=GitGutterAddLine
  140. sign define GitGutterLineModified linehl=GitGutterChangeLine
  141. sign define GitGutterLineRemoved linehl=GitGutterDeleteLine
  142. sign define GitGutterLineRemovedFirstLine linehl=GitGutterDeleteLine
  143. sign define GitGutterLineRemovedAboveAndBelow linehl=GitGutterDeleteLine
  144. sign define GitGutterLineModifiedRemoved linehl=GitGutterChangeDeleteLine
  145. else
  146. sign define GitGutterLineAdded linehl=NONE
  147. sign define GitGutterLineModified linehl=NONE
  148. sign define GitGutterLineRemoved linehl=NONE
  149. sign define GitGutterLineRemovedFirstLine linehl=NONE
  150. sign define GitGutterLineRemovedAboveAndBelow linehl=NONE
  151. sign define GitGutterLineModifiedRemoved linehl=NONE
  152. endif
  153. endfunction
  154. function! s:define_sign_linenr_highlights() abort
  155. if has('nvim-0.3.2')
  156. try
  157. if g:gitgutter_highlight_linenrs
  158. sign define GitGutterLineAdded numhl=GitGutterAddLineNr
  159. sign define GitGutterLineModified numhl=GitGutterChangeLineNr
  160. sign define GitGutterLineRemoved numhl=GitGutterDeleteLineNr
  161. sign define GitGutterLineRemovedFirstLine numhl=GitGutterDeleteLineNr
  162. sign define GitGutterLineRemovedAboveAndBelow numhl=GitGutterDeleteLineNr
  163. sign define GitGutterLineModifiedRemoved numhl=GitGutterChangeDeleteLineNr
  164. else
  165. sign define GitGutterLineAdded numhl=NONE
  166. sign define GitGutterLineModified numhl=NONE
  167. sign define GitGutterLineRemoved numhl=NONE
  168. sign define GitGutterLineRemovedFirstLine numhl=NONE
  169. sign define GitGutterLineRemovedAboveAndBelow numhl=NONE
  170. sign define GitGutterLineModifiedRemoved numhl=NONE
  171. endif
  172. catch /E475/
  173. endtry
  174. endif
  175. endfunction
  176. function! s:get_hl(group, what, mode) abort
  177. let r = synIDattr(synIDtrans(hlID(a:group)), a:what, a:mode)
  178. if empty(r) || r == -1
  179. return 'NONE'
  180. endif
  181. return r
  182. endfunction
  183. function! s:get_foreground_colors(group) abort
  184. let ctermfg = s:get_hl(a:group, 'fg', 'cterm')
  185. let guifg = s:get_hl(a:group, 'fg', 'gui')
  186. return [guifg, ctermfg]
  187. endfunction
  188. function! s:get_background_colors(group) abort
  189. let ctermbg = s:get_hl(a:group, 'bg', 'cterm')
  190. let guibg = s:get_hl(a:group, 'bg', 'gui')
  191. return [guibg, ctermbg]
  192. endfunction
  193. function! s:useful_diff_colours()
  194. let [guifg_add, ctermfg_add] = s:get_foreground_colors('DiffAdd')
  195. let [guifg_del, ctermfg_del] = s:get_foreground_colors('DiffDelete')
  196. return guifg_add != guifg_del && ctermfg_add != ctermfg_del
  197. endfunction
  198. function! s:get_foreground_fallback_colors(type)
  199. if a:type == 'Add'
  200. return ['#009900', '2']
  201. elseif a:type == 'Change'
  202. return ['#bbbb00', '3']
  203. elseif a:type == 'Delete'
  204. return ['#ff2222', '1']
  205. endif
  206. endfunction