Redo Blame command for vim

This commit is contained in:
Talia 2019-05-21 08:38:28 +02:00
parent 00b4e918c0
commit c01fecb8b2

26
git.vim
View file

@ -1,3 +1,4 @@
" vim: set noexpandtab :miv "
" ┌─────────────────┐ " " ┌─────────────────┐ "
" └─┬─┬───┬─┬───┬─┬─┘ " " └─┬─┬───┬─┬───┬─┬─┘ "
" │ │ │ │ │ │ " " │ │ │ │ │ │ "
@ -164,28 +165,13 @@ function! s:git_diff(...)
end end
endfun endfun
function! s:git_blame() function! s:git_blame(first, last)
let l:name = expand('%') let l:input = system('git blame '.expand('%').' --line-porcelain -L '.a:first.','.a:last)
let l:line = getpos('.')[1] let l:data = map(split(l:input, '\ze\x\{40} \d\+ \d\+'), {idx, elem -> split(elem, '\n')})
let l:char = getpos('.')[2]+59 return map(l:data, {idx, ary -> ary[1][match(ary[1], '\s\+\zs'):]})
let l:type = &filetype
enew
set modifiable
let &filetype = l:type
set buftype=nofile
set bufhidden=delete
set nowrap
silent exec "file Blame: ".l:name
keepjumps exec 'r !git blame '.l:name
keepjumps 0,0del "
set nomodifiable
keepjumps call setpos('.', [0, l:line, l:char, 0])
endfun endfun
command! Blame try command! -range Blame echom join(uniq(sort(<sid>git_blame(<line1>, <line2>))), ', ')
\| call s:gitroot() | call <sid>git_blame()
\| catch | echo 'Not a git repo!'
\| endtry
command! GitNext try command! GitNext try
\| call s:gitroot() | call <sid>git_next() | call s:git_info() \| call s:gitroot() | call <sid>git_next() | call s:git_info()
\| catch | echo 'Not a git repo!' \| catch | echo 'Not a git repo!'