summaryrefslogtreecommitdiff
path: root/vim/git.vim
diff options
context:
space:
mode:
authorKent Overstreet <kmo@daterainc.com>2013-10-01 14:25:07 -0700
committerKent Overstreet <kmo@daterainc.com>2013-10-01 14:32:35 -0700
commitb92bf1e27fbb0a0934f907bf33f9e42164c2828b (patch)
treedcec348f5595cde9d9bc08357ebacda70d135fea /vim/git.vim
parent8caf0ed8b6b5eded626945a7142f4d21add2fa09 (diff)
Diffstat (limited to 'vim/git.vim')
-rw-r--r--vim/git.vim95
1 files changed, 95 insertions, 0 deletions
diff --git a/vim/git.vim b/vim/git.vim
new file mode 100644
index 0000000..11675a4
--- /dev/null
+++ b/vim/git.vim
@@ -0,0 +1,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>