2 Commits

Author SHA1 Message Date
Tim Pope
70eba584a8 Timestamp WIP 2012-10-09 18:37:03 -04:00
Tim Pope
c80dba42df Colorize hashes in blame 2012-10-09 18:37:03 -04:00
3 changed files with 88 additions and 32 deletions

View File

@@ -86,13 +86,12 @@ directory. Edit a file from the repository.
Fugitive cares about the current file, not the current working
directory. Edit a file from the repository.
> Why is `:Gbrowse` not using the right browser?
> Why is `:Gbrowse` not using my system default browser?
`:Gbrowse` delegates to `git web--browse`, which is less than perfect
when it comes to finding the right browser. You can tell it the correct
browser to use with `git config --global web.browser ...`. On OS X, for
example, you might want to set this to `open`. See `git web--browse --help`
for details.
when it comes to finding the default browser on Linux. You can tell it
the correct browser to use with `git config --global web.browser ...`.
See `git web--browse --help` for details.
> Here's a patch that automatically opens the quickfix window after
> `:Ggrep`.

View File

@@ -39,11 +39,9 @@ that are part of Git repositories).
<CR> |:Gedit|
- |:Git| add
- |:Git| reset (staged files)
C |:Gcommit|
cA |:Gcommit| --amend --reuse-message=HEAD
ca |:Gcommit| --amend
cc |:Gcommit|
cva |:Gcommit| --amend --verbose
cvc |:Gcommit| --verbose
D |:Gdiff|
ds |:Gsdiff|
dp |:Git!| diff (p for patch; use :Gw to apply)
@@ -122,7 +120,7 @@ that are part of Git repositories).
:{range}Gread! [args] |:read| the output of a Git command after {range}.
*fugitive-:Gw* *fugitive-:Gwrite*
*fugitive-:Gwrite*
:Gwrite Write to the current file's path and stage the results.
When run in a work tree file, it is effectively git
add. Elsewhere, it is effectively git-checkout. A
@@ -203,7 +201,7 @@ that are part of Git repositories).
To use with GitHub FI, point g:fugitive_github_domains
at a list of domains:
>
let g:fugitive_github_domains = ['https://example.com']
let g:fugitive_github_domains = ['git.example.com']
~
:[range]Gbrowse! Like :Gbrowse, but put the URL on the clipboard rather
than opening it.

View File

@@ -506,9 +506,9 @@ function! s:buffer_path(...) dict abort
let rev = matchstr(self.spec(),'^fugitive://.\{-\}//\zs.*')
if rev != ''
let rev = s:sub(rev,'\w*','')
elseif self.spec()[0 : len(self.repo().dir())] ==# self.repo().dir() . '/'
elseif self.repo().bare()
let rev = '/.git'.self.spec()[strlen(self.repo().dir()) : -1]
elseif !self.repo().bare() && self.spec()[0 : len(self.repo().tree())] ==# self.repo().tree() . '/'
else
let rev = self.spec()[strlen(self.repo().tree()) : -1]
endif
return s:sub(s:sub(rev,'.\zs/$',''),'^/',a:0 ? a:1 : '')
@@ -1066,7 +1066,7 @@ function! s:Log(cmd,...)
let dir = getcwd()
try
execute cd.'`=s:repo().tree()`'
let &grepprg = escape(call(s:repo().git_command,cmd,s:repo()),'%#')
let &grepprg = escape(call(s:repo().git_command,cmd,s:repo()),'%')
let &grepformat = '%f::%m'
exe a:cmd
finally
@@ -1551,6 +1551,7 @@ augroup fugitive_blame
autocmd FileType fugitiveblame setlocal nomodeline | if exists('b:git_dir') | let &l:keywordprg = s:repo().keywordprg() | endif
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 ColorScheme * call s:RehighlightBlame()
augroup END
function! s:linechars(pattern)
@@ -1736,6 +1737,9 @@ function! s:BlameJump(suffix) abort
return ''
endfunction
let s:load_time = localtime()
let s:hash_colors = {}
function! s:BlameSyntax() abort
let b:current_syntax = 'fugitiveblame'
let conceal = has('conceal') ? ' conceal' : ''
@@ -1754,7 +1758,7 @@ function! s:BlameSyntax() abort
syn match FugitiveblameNotCommittedYet "(\@<=Not Committed Yet\>" contained containedin=FugitiveblameAnnotation
hi def link FugitiveblameBoundary Keyword
hi def link FugitiveblameHash Identifier
hi def link FugitiveblameUncommitted Function
hi def link FugitiveblameUncommitted Ignore
hi def link FugitiveblameTime PreProc
hi def link FugitiveblameLineNumber Number
hi def link FugitiveblameOriginalFile String
@@ -1762,12 +1766,76 @@ function! s:BlameSyntax() abort
hi def link FugitiveblameShort FugitiveblameDelimiter
hi def link FugitiveblameDelimiter Delimiter
hi def link FugitiveblameNotCommittedYet Comment
call s:HighlightBlameDates()
for lnum in range(1, line('$'))
let match = matchlist(getline(lnum), '\<\(\d\d\d\d\)-\(\d\d\)-\(\d\d\).\(\d\d\):\(\d\d\):\(\d\d\) \([+-]\d\d\d\d\)\>')[0:7]
if !empty(match)
let age = s:load_time - call(s:function('s:unixtime'), match[1:7])
else
let match = matchlist(getline(lnum), '\<\(\d\+\) \([+-]\d\d\d\d\)\>')[0:2]
if !empty(match)
let age = s:load_time - match[1]
endif
endif
if exists('age') && exists('*log')
let staleness = age < 0 ? 0 : float2nr(ceil(log(1+age/86400)))
if staleness > 15 | let staleness = 15 | endif
exe 'syn match FugitiveblameTime'.staleness.' "\<'.match[0].'\>" contained containedin=FugitiveblameAnnotation'
endif
let hash = matchstr(getline(lnum), '^\^\=\zs\x\{6\}')
if hash ==# '' || hash ==# '000000'
continue
endif
if &t_Co > 16 && exists('*csapprox#per_component#Approximate') && !has_key(s:hash_colors, hash)
let [a, 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
endif
exe 'syn match FugitiveblameHash'.hash.' "\%(^\^\=\)\@<='.hash.'\x\{1,34\}\>" nextgroup=FugitiveblameAnnotation,FugitiveblameOriginalLineNumber,fugitiveblameOriginalFile skipwhite'
exe 'hi FugitiveblameHash'.hash.' guifg=#'.hash.get(s:hash_colors, hash, '')
endfor
endfunction
function! s:HighlightBlameDates() abort
for i in range(0, 15)
let shade = 0x11 * (&background == 'dark' ? 0xf - i : i)
if &t_Co > 16 && exists('*csapprox#per_component#Approximate')
let cterm = ' ctermfg='.csapprox#per_component#Approximate(shade, shade, shade)
else
let cterm = ''
endif
execute 'hi FugitiveblameTime'.i.' guifg=#'.repeat(printf('%02x', shade),3).cterm
endfor
endfunction
function! s:RehighlightBlame() abort
call s:HighlightBlameDates()
for [hash, cterm] in items(s:hash_colors)
exe 'hi FugitiveblameHash'.hash.' guifg=#'.hash.cterm
endfor
endfunction
function! s:unixtime(year,mon,day,hour,min,sec, ...) abort
let y = a:year + 4800 - (a:mon <= 2)
let m = a:mon + (a:mon <= 2 ? 9 : -3)
let jul = a:day + (153*m+2)/5 + 1461*y/4 - 32083
let days = jul - y/100 + y/400 + 38 - 2440588
let offset = a:0 ? a:1 : '0000'
let seconds = days * 86400 + a:hour * 3600 + a:min * 60 + a:sec
let seconds -= 3600 * matchstr(offset, '[+-]\=\d\d') - 60 * matchstr(offset, '\d\d$')
return seconds
endfunction
" }}}1
" Gbrowse {{{1
call s:command("-bar -bang -range -nargs=? -complete=customlist,s:EditComplete Gbrowse :execute s:Browse(<bang>0,<line1>,<count>,<f-args>)")
call s:command("-bar -bang -count=0 -nargs=? -complete=customlist,s:EditComplete Gbrowse :execute s:Browse(<bang>0,<line1>,<count>,<f-args>)")
function! s:Browse(bang,line1,count,...) abort
try
@@ -1849,7 +1917,7 @@ function! s:Browse(bang,line1,count,...) abort
let url = s:github_url(s:repo(),raw,rev,commit,path,type,a:line1,a:count)
if url == ''
let url = s:instaweb_url(s:repo(),rev,commit,path,type,a:count > 0 ? a:line1 : 0)
let url = s:instaweb_url(s:repo(),rev,commit,path,type,a:count ? a:line1 : 0)
endif
if url == ''
@@ -1870,19 +1938,14 @@ endfunction
function! s:github_url(repo,url,rev,commit,path,type,line1,line2) abort
let path = a:path
let domain_pattern = 'github\.com'
let domains = exists('g:fugitive_github_domains') ? g:fugitive_github_domains : []
for domain in domains
let domain_pattern .= '\|' . escape(split(domain, '://')[-1], '.')
for domain in exists('g:fugitive_github_domains') ? g:fugitive_github_domains : []
let domain_pattern .= '\|' . escape(domain, '.')
endfor
let repo = matchstr(a:url,'^\%(https\=://\|git://\|git@\)\zs\('.domain_pattern.'\)[/:].\{-\}\ze\%(\.git\)\=$')
if repo ==# ''
return ''
endif
if index(domains, 'http://' . matchstr(repo, '^[^:/]*')) >= 0
let root = 'http://' . s:sub(repo,':','/')
else
let root = 'https://' . s:sub(repo,':','/')
endif
let root = 'https://' . s:sub(repo,':','/')
if path =~# '^\.git/refs/heads/'
let branch = a:repo.git_chomp('config','branch.'.path[16:-1].'.merge')[11:-1]
if branch ==# ''
@@ -1912,9 +1975,9 @@ function! s:github_url(repo,url,rev,commit,path,type,line1,line2) abort
let url = s:sub(root . '/tree/' . commit . '/' . path,'/$','')
elseif a:type == 'blob'
let url = root . '/blob/' . commit . '/' . path
if a:line2 > 0 && a:line1 == a:line2
if a:line2 && a:line1 == a:line2
let url .= '#L' . a:line1
elseif a:line2 > 0
elseif a:line2
let url .= '#L' . a:line1 . '-' . a:line2
endif
elseif a:type == 'tag'
@@ -2053,8 +2116,7 @@ function! s:BufReadIndex()
nnoremap <buffer> <silent> cA :<C-U>Gcommit --amend --reuse-message=HEAD<CR>
nnoremap <buffer> <silent> ca :<C-U>Gcommit --amend<CR>
nnoremap <buffer> <silent> cc :<C-U>Gcommit<CR>
nnoremap <buffer> <silent> cva :<C-U>Gcommit --amend --verbose<CR>
nnoremap <buffer> <silent> cvc :<C-U>Gcommit --verbose<CR>
nnoremap <buffer> <silent> cv :<C-U>Gcommit -v<CR>
nnoremap <buffer> <silent> D :<C-U>execute <SID>StageDiff('Gvdiff')<CR>
nnoremap <buffer> <silent> dd :<C-U>execute <SID>StageDiff('Gvdiff')<CR>
nnoremap <buffer> <silent> dh :<C-U>execute <SID>StageDiff('Gsdiff')<CR>
@@ -2492,7 +2554,7 @@ function! fugitive#foldtext() abort
let [add, remove] = [-1, -1]
let filename = ''
for lnum in range(v:foldstart, v:foldend)
if filename ==# '' && getline(lnum) =~# '^[+-]\{3\} [abciow12]/'
if filename ==# '' && getline(lnum) =~# '^[+-]\{3\} [ab]/'
let filename = getline(lnum)[6:-1]
endif
if getline(lnum) =~# '^+'
@@ -2506,9 +2568,6 @@ function! fugitive#foldtext() abort
if filename ==# ''
let filename = matchstr(getline(v:foldstart), '^diff .\{-\} a/\zs.*\ze b/')
endif
if filename ==# ''
let filename = getline(v:foldstart)[5:-1]
endif
if exists('binary')
return 'Binary: '.filename
else