diff --git a/autoload/fugitive.vim b/autoload/fugitive.vim index 2758ec1..0faa6ea 100644 --- a/autoload/fugitive.vim +++ b/autoload/fugitive.vim @@ -5725,7 +5725,6 @@ function! fugitive#BlameSyntax() abort syn spell notoplevel syn match FugitiveblameBlank "^\s\+\s\@=" nextgroup=FugitiveblameAnnotation,FugitiveblameScoreDebug,FugitiveblameOriginalFile,FugitiveblameOriginalLineNumber skipwhite syn match FugitiveblameHash "\%(^\^\=[?*]*\)\@<=\<\x\{7,\}\>" nextgroup=FugitiveblameAnnotation,FugitiveblameScoreDebug,FugitiveblameOriginalLineNumber,FugitiveblameOriginalFile skipwhite - syn match FugitiveblameUncommitted "\%(^\^\=\)\@<=\<0\{7,\}\>" nextgroup=FugitiveblameAnnotation,FugitiveblameScoreDebug,FugitiveblameOriginalLineNumber,FugitiveblameOriginalFile skipwhite if s:HasOpt(flags, '-b') || FugitiveConfigGet('blame.blankBoundary') =~# '^1$\|^true$' syn match FugitiveblameBoundaryIgnore "^\^[*?]*\x\{7,\}\>" nextgroup=FugitiveblameAnnotation,FugitiveblameScoreDebug,FugitiveblameOriginalLineNumber,FugitiveblameOriginalFile skipwhite else @@ -5757,31 +5756,37 @@ function! fugitive#BlameSyntax() abort endif let seen = {} for lnum in range(1, line('$')) - let hash = matchstr(getline(lnum), '^\^\=\zs\x\{6\}') - if hash ==# '' || hash ==# '000000' || has_key(seen, hash) + let orig_hash = matchstr(getline(lnum), '^\^\=[*?]*\zs\x\{6\}') + let hash = orig_hash + let hash = substitute(hash, '\(\x\)\x', '\=submatch(1).printf("%x", 15-str2nr(submatch(1),16))', 'g') + let hash = substitute(hash, '\(\x\x\)', '\=printf("%02x", str2nr(submatch(1),16)*3/4+32)', 'g') + if hash ==# '' || orig_hash ==# '000000' || has_key(seen, hash) continue endif let seen[hash] = 1 - if &t_Co > 16 && get(g:, 'CSApprox_loaded') && !empty(findfile('autoload/csapprox/per_component.vim', escape(&rtp, ' '))) - \ && empty(get(s:hash_colors, hash)) - let [s, r, g, b; __] = map(matchlist(hash, '\(\x\x\)\(\x\x\)\(\x\x\)'), 'str2nr(v:val,16)') - let color = csapprox#per_component#Approximate(r, g, b) - if color == 16 && &background ==# 'dark' - let color = 8 + if &t_Co == 256 + let [s, r, g, b; __] = map(matchlist(orig_hash, '\(\x\)\x\(\x\)\x\(\x\)\x'), 'str2nr(v:val,16)') + let color = 16 + (r + 1) / 3 * 36 + (g + 1) / 3 * 6 + (b + 1) / 3 + if color == 16 + let color = 235 + elseif color == 231 + let color = 255 endif let s:hash_colors[hash] = ' ctermfg='.color else let s:hash_colors[hash] = '' endif - exe 'syn match FugitiveblameHash'.hash.' "\%(^\^\=\)\@<='.hash.'\x\{1,34\}\>" nextgroup=FugitiveblameAnnotation,FugitiveblameOriginalLineNumber,fugitiveblameOriginalFile skipwhite' + let pattern = substitute(orig_hash, '^\(\x\)\x\(\x\)\x\(\x\)\x$', '\1\\x\2\\x\3\\x', '') . '*\>' + exe 'syn match FugitiveblameHash'.hash.' "\%(^\^\=[*?]*\)\@<='.pattern.'" nextgroup=FugitiveblameAnnotation,FugitiveblameOriginalLineNumber,fugitiveblameOriginalFile skipwhite' endfor + syn match FugitiveblameUncommitted "\%(^\^\=[?*]*\)\@<=\<0\{7,\}\>" nextgroup=FugitiveblameAnnotation,FugitiveblameScoreDebug,FugitiveblameOriginalLineNumber,FugitiveblameOriginalFile skipwhite call s:BlameRehighlight() endfunction function! s:BlameRehighlight() abort for [hash, cterm] in items(s:hash_colors) if !empty(cterm) || has('gui_running') || has('termguicolors') && &termguicolors - exe 'hi FugitiveblameHash'.hash.' guifg=#'.hash.get(s:hash_colors, hash, '') + exe 'hi FugitiveblameHash'.hash.' guifg=#' . hash . cterm else exe 'hi link FugitiveblameHash'.hash.' Identifier' endif diff --git a/doc/fugitive.txt b/doc/fugitive.txt index 07f605d..987cdce 100644 --- a/doc/fugitive.txt +++ b/doc/fugitive.txt @@ -59,6 +59,12 @@ that are part of Git repositories). ~ reblame at [count]th first grandparent P reblame at [count]th parent (like HEAD^[count]) + *g:fugitive_dynamic_colors* + In the GUI or a 256 color terminal, commit hashes will + highlighted in different colors. To disable this: +> + let g:fugitive_dynamic_colors = 0 +< :[range]Git blame [...] If a range is given, just that part of the file will :Git blame [...] {file} be blamed, and a horizontal split without scrollbinding is used. You can also give an arbitrary