highlight.vim 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. function! gitgutter#highlight#define_sign_column_highlight()
  2. if g:gitgutter_override_sign_column_highlight
  3. highlight! link SignColumn LineNr
  4. else
  5. highlight default link SignColumn LineNr
  6. endif
  7. endfunction
  8. function! gitgutter#highlight#define_highlights()
  9. let [guibg, ctermbg] = gitgutter#highlight#get_background_colors('SignColumn')
  10. " Highlights used by the signs.
  11. execute "highlight GitGutterAddDefault guifg=#009900 guibg=" . guibg . " ctermfg=2 ctermbg=" . ctermbg
  12. execute "highlight GitGutterChangeDefault guifg=#bbbb00 guibg=" . guibg . " ctermfg=3 ctermbg=" . ctermbg
  13. execute "highlight GitGutterDeleteDefault guifg=#ff2222 guibg=" . guibg . " ctermfg=1 ctermbg=" . ctermbg
  14. highlight default link GitGutterChangeDeleteDefault GitGutterChangeDefault
  15. execute "highlight GitGutterAddInvisible guifg=bg guibg=" . guibg . " ctermfg=" . ctermbg . " ctermbg=" . ctermbg
  16. execute "highlight GitGutterChangeInvisible guifg=bg guibg=" . guibg . " ctermfg=" . ctermbg . " ctermbg=" . ctermbg
  17. execute "highlight GitGutterDeleteInvisible guifg=bg guibg=" . guibg . " ctermfg=" . ctermbg . " ctermbg=" . ctermbg
  18. highlight default link GitGutterChangeDeleteInvisible GitGutterChangeInvisble
  19. highlight default link GitGutterAdd GitGutterAddDefault
  20. highlight default link GitGutterChange GitGutterChangeDefault
  21. highlight default link GitGutterDelete GitGutterDeleteDefault
  22. highlight default link GitGutterChangeDelete GitGutterChangeDeleteDefault
  23. " Highlights used for the whole line.
  24. highlight default link GitGutterAddLine DiffAdd
  25. highlight default link GitGutterChangeLine DiffChange
  26. highlight default link GitGutterDeleteLine DiffDelete
  27. highlight default link GitGutterChangeDeleteLine GitGutterChangeLine
  28. endfunction
  29. function! gitgutter#highlight#define_signs()
  30. sign define GitGutterLineAdded
  31. sign define GitGutterLineModified
  32. sign define GitGutterLineRemoved
  33. sign define GitGutterLineRemovedFirstLine
  34. sign define GitGutterLineModifiedRemoved
  35. sign define GitGutterDummy
  36. call gitgutter#highlight#define_sign_text()
  37. call gitgutter#highlight#define_sign_text_highlights()
  38. call gitgutter#highlight#define_sign_line_highlights()
  39. endfunction
  40. function! gitgutter#highlight#define_sign_text()
  41. execute "sign define GitGutterLineAdded text=" . g:gitgutter_sign_added
  42. execute "sign define GitGutterLineModified text=" . g:gitgutter_sign_modified
  43. execute "sign define GitGutterLineRemoved text=" . g:gitgutter_sign_removed
  44. execute "sign define GitGutterLineRemovedFirstLine text=" . g:gitgutter_sign_removed_first_line
  45. execute "sign define GitGutterLineModifiedRemoved text=" . g:gitgutter_sign_modified_removed
  46. endfunction
  47. function! gitgutter#highlight#define_sign_text_highlights()
  48. " Once a sign's text attribute has been defined, it cannot be undefined or
  49. " set to an empty value. So to make signs' text disappear (when toggling
  50. " off or disabling) we make them invisible by setting their foreground colours
  51. " to the background's.
  52. if g:gitgutter_signs
  53. sign define GitGutterLineAdded texthl=GitGutterAdd
  54. sign define GitGutterLineModified texthl=GitGutterChange
  55. sign define GitGutterLineRemoved texthl=GitGutterDelete
  56. sign define GitGutterLineRemovedFirstLine texthl=GitGutterDelete
  57. sign define GitGutterLineModifiedRemoved texthl=GitGutterChangeDelete
  58. else
  59. sign define GitGutterLineAdded texthl=GitGutterAddInvisible
  60. sign define GitGutterLineModified texthl=GitGutterChangeInvisible
  61. sign define GitGutterLineRemoved texthl=GitGutterDeleteInvisible
  62. sign define GitGutterLineRemovedFirstLine texthl=GitGutterDeleteInvisible
  63. sign define GitGutterLineModifiedRemoved texthl=GitGutterChangeDeleteInvisible
  64. endif
  65. endfunction
  66. function! gitgutter#highlight#define_sign_line_highlights()
  67. if g:gitgutter_highlight_lines
  68. sign define GitGutterLineAdded linehl=GitGutterAddLine
  69. sign define GitGutterLineModified linehl=GitGutterChangeLine
  70. sign define GitGutterLineRemoved linehl=GitGutterDeleteLine
  71. sign define GitGutterLineRemovedFirstLine linehl=GitGutterDeleteLine
  72. sign define GitGutterLineModifiedRemoved linehl=GitGutterChangeDeleteLine
  73. else
  74. sign define GitGutterLineAdded linehl=
  75. sign define GitGutterLineModified linehl=
  76. sign define GitGutterLineRemoved linehl=
  77. sign define GitGutterLineRemovedFirstLine linehl=
  78. sign define GitGutterLineModifiedRemoved linehl=
  79. endif
  80. endfunction
  81. function! gitgutter#highlight#get_background_colors(group)
  82. redir => highlight
  83. silent execute 'silent highlight ' . a:group
  84. redir END
  85. let link_matches = matchlist(highlight, 'links to \(\S\+\)')
  86. if len(link_matches) > 0 " follow the link
  87. return gitgutter#highlight#get_background_colors(link_matches[1])
  88. endif
  89. let ctermbg = gitgutter#highlight#match_highlight(highlight, 'ctermbg=\([0-9A-Za-z]\+\)')
  90. let guibg = gitgutter#highlight#match_highlight(highlight, 'guibg=\([#0-9A-Za-z]\+\)')
  91. return [guibg, ctermbg]
  92. endfunction
  93. function! gitgutter#highlight#match_highlight(highlight, pattern)
  94. let matches = matchlist(a:highlight, a:pattern)
  95. if len(matches) == 0
  96. return 'NONE'
  97. endif
  98. return matches[1]
  99. endfunction