blob: 11675a41e9251ae2313d742982f5ce53b029fcda (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
func! MakeScratch()
setlocal buftype=nofile
setlocal bufhidden=wipe
setlocal noswapfile
setlocal nomodifiable
" setlocal nobuflisted
endfunc
func! Old(...)
setlocal splitright
let l:fname = exists("b:fname") ? b:fname : bufname("%")
let l:n = exists("a:1") ? a:1 : ""
let l:cmd = "read! git show " . l:n . ":" . l:fname
let l:ftype = &filetype
let l:rev = system("git rev-parse --verify --short " . l:n)
let l:rev = strpart(l:rev, 0, stridx(l:rev, "\n")) . " " . l:n
vnew
exe l:cmd
call MakeScratch()
let b:fname = l:fname
let &l:statusline=l:rev . "%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P"
let &l:filetype=l:ftype
endfunc
func! Diff(...)
let l:foldmethod = &foldmethod
let l:bufnr = bufnr('%')
call Old(exists("a:1") ? a:1 : "HEAD")
exe 'au BufDelete <buffer> buffer ' . l:bufnr . '|diffoff |set foldmethod=' . l:foldmethod
diffthis
wincmd p
diffthis
endfunc
command! -nargs=? Diff call Diff(<f-args>)
command! -nargs=? Old call Old(<f-args>)
func! Blame()
endfunc
func! GitBlameLine()
if &previewwindow
return
endif
let l:bufnr = bufnr('%')
let b:blameline = line('.')
let l:cmd = 'read! git log -n1 `git blame --root -L ' . b:blameline . ",+1 " . bufname("%") .
\'|cut -d\ -f1`'
silent! wincmd P
if &previewwindow
enew
else
pedit
wincmd P
endif
enew
silent! exe l:cmd
call MakeScratch()
setlocal filetype=git
exe 'au BufDelete <buffer> nested au! * <buffer=' . l:bufnr . '> nested'
wincmd p
endfunc
func! BlameLineChanged()
if b:blameline != line('.')
call GitBlameLine()
endif
endfunc
func! BlameLine()
let l:bufnr = bufnr('%')
call GitBlameLine()
"wincmd p
"exe 'au BufDelete <buffer> buffer ' . l:bufnr . '|au! blame * <buffer>'
"wincmd p
augroup blame
au!
au CursorMoved,CursorMovedI <buffer> call BlameLineChanged()
augroup END
endfunc
nmap <C-g>s :call GitBlameLine() <CR>
|