Colorize hashes in blame

References #369.
This commit is contained in:
Tim Pope 2012-07-07 17:30:08 -04:00
parent 276f89837f
commit fb5661211d

View File

@ -1670,6 +1670,7 @@ augroup fugitive_blame
autocmd FileType fugitiveblame setlocal nomodeline | if exists('b:git_dir') | let &l:keywordprg = s:repo().keywordprg() | endif autocmd FileType fugitiveblame setlocal nomodeline | if exists('b:git_dir') | let &l:keywordprg = s:repo().keywordprg() | endif
autocmd Syntax fugitiveblame call s:BlameSyntax() autocmd Syntax fugitiveblame call s:BlameSyntax()
autocmd User Fugitive if s:buffer().type('file', 'blob') | exe "command! -buffer -bar -bang -range=0 -nargs=* Gblame :execute s:Blame(<bang>0,<line1>,<line2>,<count>,[<f-args>])" | endif autocmd User Fugitive if s:buffer().type('file', 'blob') | exe "command! -buffer -bar -bang -range=0 -nargs=* Gblame :execute s:Blame(<bang>0,<line1>,<line2>,<count>,[<f-args>])" | endif
autocmd ColorScheme,GUIEnter * call s:RehighlightBlame()
augroup END augroup END
function! s:linechars(pattern) abort function! s:linechars(pattern) abort
@ -1858,6 +1859,8 @@ function! s:BlameJump(suffix) abort
return '' return ''
endfunction endfunction
let s:hash_colors = {}
function! s:BlameSyntax() abort function! s:BlameSyntax() abort
let b:current_syntax = 'fugitiveblame' let b:current_syntax = 'fugitiveblame'
let conceal = has('conceal') ? ' conceal' : '' let conceal = has('conceal') ? ' conceal' : ''
@ -1876,7 +1879,7 @@ function! s:BlameSyntax() abort
syn match FugitiveblameNotCommittedYet "(\@<=Not Committed Yet\>" contained containedin=FugitiveblameAnnotation syn match FugitiveblameNotCommittedYet "(\@<=Not Committed Yet\>" contained containedin=FugitiveblameAnnotation
hi def link FugitiveblameBoundary Keyword hi def link FugitiveblameBoundary Keyword
hi def link FugitiveblameHash Identifier hi def link FugitiveblameHash Identifier
hi def link FugitiveblameUncommitted Function hi def link FugitiveblameUncommitted Ignore
hi def link FugitiveblameTime PreProc hi def link FugitiveblameTime PreProc
hi def link FugitiveblameLineNumber Number hi def link FugitiveblameLineNumber Number
hi def link FugitiveblameOriginalFile String hi def link FugitiveblameOriginalFile String
@ -1884,6 +1887,37 @@ function! s:BlameSyntax() abort
hi def link FugitiveblameShort FugitiveblameDelimiter hi def link FugitiveblameShort FugitiveblameDelimiter
hi def link FugitiveblameDelimiter Delimiter hi def link FugitiveblameDelimiter Delimiter
hi def link FugitiveblameNotCommittedYet Comment hi def link FugitiveblameNotCommittedYet Comment
let seen = {}
for lnum in range(1, line('$'))
let hash = matchstr(getline(lnum), '^\^\=\zs\x\{6\}')
if hash ==# '' || hash ==# '000000' || has_key(seen, hash)
continue
endif
let seen[hash] = 1
if &t_Co > 16 && exists('g:CSApprox_loaded')
\ && 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
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'
endfor
call s:RehighlightBlame()
endfunction
function! s:RehighlightBlame() abort
for [hash, cterm] in items(s:hash_colors)
if !empty(cterm) || has('gui_running')
exe 'hi FugitiveblameHash'.hash.' guifg=#'.hash.get(s:hash_colors, hash, '')
else
exe 'hi link FugitiveblameHash'.hash.' Identifier'
endif
endfor
endfunction endfunction
" Section: Gbrowse " Section: Gbrowse