Pass :Gblame flags along to git-blame

This commit is contained in:
Tim Pope 2010-03-05 22:28:53 -05:00
parent 05c0efacab
commit 9c86a7d379
2 changed files with 24 additions and 12 deletions

View File

@ -139,11 +139,13 @@ that are part of Git repositories).
buffer. buffer.
*fugitive-:Gblame* *fugitive-:Gblame*
:Gblame Run git-blame on the file and open the results in a :Gblame [flags] Run git-blame on the file and open the results in a
scroll bound vertical split. Press enter on a line to scroll bound vertical split. Press enter on a line to
reblame the file as it was in that commit. reblame the file as it was in that commit. You can
give any of ltwfsMC as flags and they will be passed
along to git-blame.
:[range]Gblame Run git-blame on the given range. :[range]Gblame [flags] Run git-blame on the given range.
MAPPINGS *fugitive-mappings* MAPPINGS *fugitive-mappings*

View File

@ -1120,16 +1120,20 @@ augroup fugitive_blame
autocmd BufReadPost *.fugitiveblame setfiletype fugitiveblame autocmd BufReadPost *.fugitiveblame setfiletype fugitiveblame
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 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
augroup END augroup END
function! s:Blame(bang,line1,line2,count) abort function! s:Blame(bang,line1,line2,count,args) abort
try try
if s:buffer().path() == '' if s:buffer().path() == ''
call s:throw('file or blob required') call s:throw('file or blob required')
endif endif
if filter(copy(a:args),'v:val !~# "^\\%(--root\|--show-name\\|-\\=\\%([ltwfs]\\|[MC]\\d*\\)\\+\\)$"') != []
call s:throw('unsupported option')
endif
call map(a:args,'s:sub(v:val,"^\\ze[^-]","-")')
let git_dir = s:repo().dir() let git_dir = s:repo().dir()
let cmd = ['--no-pager', 'blame', '--show-number'] let cmd = ['--no-pager', 'blame', '--show-number'] + a:args
if s:buffer().commit() =~# '\D\|..' if s:buffer().commit() =~# '\D\|..'
let cmd += [s:buffer().commit()] let cmd += [s:buffer().commit()]
else else
@ -1169,6 +1173,7 @@ function! s:Blame(bang,line1,line2,count) abort
let b:fugitive_type = 'blame' let b:fugitive_type = 'blame'
let b:fugitive_blamed_bufnr = bufnr let b:fugitive_blamed_bufnr = bufnr
let b:fugitive_restore = restore let b:fugitive_restore = restore
let b:fugitive_blame_arguments = join(a:args,' ')
call s:Detect(expand('%:p')) call s:Detect(expand('%:p'))
execute top execute top
normal! zt normal! zt
@ -1199,11 +1204,12 @@ function! s:BlameJump(suffix) abort
if commit =~# '^0\+$' if commit =~# '^0\+$'
let commit = ':0' let commit = ':0'
endif endif
let lnum = matchstr(getline('.'),'\d\+\ze (') let lnum = matchstr(getline('.'),'\d\+\ze\s\+[([:digit:]]')
let path = matchstr(getline('.'),'^\^\=\zs\x\+\s\+\zs.\{-\}\ze\s*\d\+ (') let path = matchstr(getline('.'),'^\^\=\zs\x\+\s\+\zs.\{-\}\ze\s*\d\+ ')
if path ==# '' if path ==# ''
let path = s:buffer(b:fugitive_blamed_bufnr).path() let path = s:buffer(b:fugitive_blamed_bufnr).path()
endif endif
let args = b:fugitive_blame_arguments
let offset = line('.') - line('w0') let offset = line('.') - line('w0')
let bufnr = bufnr('%') let bufnr = bufnr('%')
let winnr = bufwinnr(b:fugitive_blamed_bufnr) let winnr = bufwinnr(b:fugitive_blamed_bufnr)
@ -1214,7 +1220,7 @@ function! s:BlameJump(suffix) abort
if winnr > 0 if winnr > 0
exe bufnr.'bdelete' exe bufnr.'bdelete'
endif endif
Gblame execute 'Gblame '.args
execute lnum execute lnum
let delta = line('.') - line('w0') - offset let delta = line('.') - line('w0') - offset
if delta > 0 if delta > 0
@ -1229,13 +1235,16 @@ endfunction
function! s:BlameSyntax() abort function! s:BlameSyntax() abort
let b:current_syntax = 'fugitiveblame' let b:current_syntax = 'fugitiveblame'
syn match FugitiveblameBoundary "^\^" syn match FugitiveblameBoundary "^\^"
syn match FugitiveblameHash "\%(^\^\=\)\@<=\x\{7,40\}\>" nextgroup=FugitiveblameAnnotation,fugitiveblameOriginalFile,FugitiveblameOriginalLineNumber skipwhite syn match FugitiveblameBlank "^\s\+\s\@=" nextgroup=FugitiveblameAnnotation,fugitiveblameOriginalFile,FugitiveblameOriginalLineNumber skipwhite
syn match FugitiveblameHash "\%(^\^\=\)\@<=\x\{7,40\}\>" nextgroup=FugitiveblameAnnotation,FugitiveblameOriginalLineNumber,fugitiveblameOriginalFile skipwhite
syn match FugitiveblameUncommitted "\%(^\^\=\)\@<=0\{7,40\}\>" nextgroup=FugitiveblameAnnotation,FugitiveblameOriginalLineNumber,fugitiveblameOriginalFile skipwhite syn match FugitiveblameUncommitted "\%(^\^\=\)\@<=0\{7,40\}\>" nextgroup=FugitiveblameAnnotation,FugitiveblameOriginalLineNumber,fugitiveblameOriginalFile skipwhite
syn region FugitiveblameAnnotation matchgroup=FugitiveblameDelimiter start="(" end="\%( \d\+\)\@<=)" contained keepend oneline syn region FugitiveblameAnnotation matchgroup=FugitiveblameDelimiter start="(" end="\%( \d\+\)\@<=)" contained keepend oneline
syn match FugitiveblameTime "[0-9:/+-][0-9:/+ -]*[0-9:/+-]\%( \+\d\+)\)\@=" contained containedin=FugitiveblameAnnotation syn match FugitiveblameTime "[0-9:/+-][0-9:/+ -]*[0-9:/+-]\%( \+\d\+)\)\@=" contained containedin=FugitiveblameAnnotation
syn match FugitiveblameLineNumber " \@<=\d\+)\@=" contained containedin=FugitiveblameAnnotation syn match FugitiveblameLineNumber " \@<=\d\+)\@=" contained containedin=FugitiveblameAnnotation
syn match FugitiveblameOriginalFile " \%(\f\+\D\@<=\|\D\@=\f\+\)\%(\%(\s\+\d\+\)\= (\)\@=" contained nextgroup=FugitiveblameOriginalLineNumber,FugitiveblameAnnotation skipwhite syn match FugitiveblameOriginalFile " \%(\f\+\D\@<=\|\D\@=\f\+\)\%(\%(\s\+\d\+\)\=\s\%((\|\s*\d\+)\)\)\@=" contained nextgroup=FugitiveblameOriginalLineNumber,FugitiveblameAnnotation skipwhite
syn match FugitiveblameOriginalLineNumber " \@<=\d\+\%( (\)\@=" contained nextgroup=FugitiveblameAnnotation skipwhite syn match FugitiveblameOriginalLineNumber " \@<=\d\+\%(\s(\)\@=" contained nextgroup=FugitiveblameAnnotation skipwhite
syn match FugitiveblameOriginalLineNumber " \@<=\d\+\%(\s\+\d\+)\)\@=" contained nextgroup=FugitiveblameShort skipwhite
syn match FugitiveblameShort "\d\+)" contained contains=FugitiveblameLineNumber
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
@ -1244,6 +1253,7 @@ function! s:BlameSyntax() abort
hi def link FugitiveblameLineNumber Number hi def link FugitiveblameLineNumber Number
hi def link FugitiveblameOriginalFile String hi def link FugitiveblameOriginalFile String
hi def link FugitiveblameOriginalLineNumber Float hi def link FugitiveblameOriginalLineNumber Float
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
endfunction endfunction