From 7186f8bcadeff3e4cc1de7f2e28739a5408498d9 Mon Sep 17 00:00:00 2001 From: Vaz Allen Date: Fri, 8 Mar 2013 11:14:56 +0100 Subject: [PATCH] Highlighting customisation tweaks. Highlight groups for signs: - renamed highlight groups with `GitGutter` prefix, and following the naming style of the builtin groups `DiffAdd`, `DiffChange`, etc. - using `highlight default link` to set default colours for signs. e.g. the plugin defines `GitGutterAddDefault` as green, and default (if `g:gitgutter_highlights`) links `GitGutterAdd` to it (which the user can customise). Highlight groups for lines: - added gitgutter-specific highlight groups for line highlighting (`GitGutterAddLine`, etc) so that this highlighting can be customised independent of `DiffAdd` et al (which these default link to). - line highlighting toggling now only changes the linehl attribute. The `linehl` attribute is toggled in `s:update_line_highlights`, which separates concerns more clearly. I'm thinking ahead to the possibility of the sign text being configurable, and thinking it will be DRYer to keep these things separate. Maybe it's just aesthetic though. Bonus: resolved "eugh" ;) --- plugin/gitgutter.vim | 75 ++++++++++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 31 deletions(-) diff --git a/plugin/gitgutter.vim b/plugin/gitgutter.vim index 5851d69..06b3369 100644 --- a/plugin/gitgutter.vim +++ b/plugin/gitgutter.vim @@ -13,14 +13,16 @@ if !exists('g:gitgutter_highlights') let g:gitgutter_highlights = 1 endif +if !exists('g:gitgutter_highlight_lines') + let g:gitgutter_highlight_lines = 0 +endif + function! s:init() if !exists('g:gitgutter_initialised') - let s:highlight_lines = 0 + let s:highlight_lines = g:gitgutter_highlight_lines call s:define_signs() - if g:gitgutter_highlights - call s:define_highlights() - endif + call s:define_highlights() " Vim doesn't namespace sign ids so every plugin shares the same " namespace. Sign ids are simply integers so to avoid clashes with other @@ -37,23 +39,33 @@ function! s:init() endfunction function! s:define_highlights() - highlight lineAdded guifg=#009900 guibg=NONE ctermfg=2 ctermbg=NONE - highlight lineModified guifg=#bbbb00 guibg=NONE ctermfg=3 ctermbg=NONE - highlight lineRemoved guifg=#ff2222 guibg=NONE ctermfg=1 ctermbg=NONE + " sign highlights + hi GitGutterAddDefault guifg=#009900 guibg=NONE ctermfg=2 ctermbg=NONE + hi GitGutterChangeDefault guifg=#bbbb00 guibg=NONE ctermfg=3 ctermbg=NONE + hi GitGutterDeleteDefault guifg=#ff2222 guibg=NONE ctermfg=1 ctermbg=NONE + hi default link GitGutterChangeDeleteDefault GitGutterChangeDefault + + if g:gitgutter_highlights + hi default link GitGutterAdd GitGutterAddDefault + hi default link GitGutterChange GitGutterChangeDefault + hi default link GitGutterDelete GitGutterDeleteDefault + hi default link GitGutterChangeDelete GitGutterChangeDeleteDefault + endif + + " line highlight defaults, meant to be user-edited + hi default link GitGutterAddLine DiffAdd + hi default link GitGutterChangeLine DiffChange + hi default link GitGutterDeleteLine DiffDelete + hi default link GitGutterChangeDeleteLine GitGutterChangeLineDefault + + call s:update_line_highlights(s:highlight_lines) endfunction function! s:define_signs() - if s:highlight_lines - sign define GitGutterLineAdded text=+ texthl=lineAdded linehl=DiffAdd - sign define GitGutterLineModified text=~ texthl=lineModified linehl=DiffChange - sign define GitGutterLineRemoved text=_ texthl=lineRemoved linehl=DiffDelete - sign define GitGutterLineModifiedRemoved text=~_ texthl=lineModified linehl=DiffChange - else - sign define GitGutterLineAdded text=+ texthl=lineAdded linehl=NONE - sign define GitGutterLineModified text=~ texthl=lineModified linehl=NONE - sign define GitGutterLineRemoved text=_ texthl=lineRemoved linehl=NONE - sign define GitGutterLineModifiedRemoved text=~_ texthl=lineModified linehl=NONE - endif + sign define GitGutterLineAdded text=+ texthl=GitGutterAdd linehl= + sign define GitGutterLineModified text=~ texthl=GitGutterChange linehl= + sign define GitGutterLineRemoved text=_ texthl=GitGutterDelete linehl= + sign define GitGutterLineModifiedRemoved text=~_ texthl=GitGutterChangeDelete linehl= endfunction " }}} @@ -66,7 +78,17 @@ endfunction function! s:update_line_highlights(highlight_lines) let s:highlight_lines = a:highlight_lines - call s:define_signs() + if s:highlight_lines + sign define GitGutterLineAdded linehl=GitGutterAddLine + sign define GitGutterLineModified linehl=GitGutterChangeLine + sign define GitGutterLineRemoved linehl=GitGutterDeleteLine + sign define GitGutterLineModifiedRemoved linehl=GitGutterChangeDeleteLine + else + sign define GitGutterLineAdded linehl= + sign define GitGutterLineModified linehl= + sign define GitGutterLineRemoved linehl= + sign define GitGutterLineModifiedRemoved linehl= + endif redraw! endfunction @@ -273,18 +295,9 @@ endfunction function! s:show_signs(file_name, modified_lines) for line in a:modified_lines let line_number = line[0] - let type = line[1] - " TODO: eugh - if type ==? 'added' - let name = 'GitGutterLineAdded' - elseif type ==? 'removed' - let name = 'GitGutterLineRemoved' - elseif type ==? 'modified' - let name = 'GitGutterLineModified' - elseif type ==? 'modified_removed' - let name = 'GitGutterLineModifiedRemoved' - endif - call s:add_sign(line_number, name, a:file_name) + " snake case to camel case + let type = substitute(line[1], '\v(.)(\a+)(_(.)(.+))?', '\u\1\l\2\u\4\l\5', '') + call s:add_sign(line_number, 'GitGutterLine' . type, a:file_name) endfor endfunction