summaryrefslogtreecommitdiff
path: root/vim/git.vim
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>