Merge pull request 36 from @jamessan

Closes #36.
This commit is contained in:
Marco Hinz 2013-07-04 11:45:57 +02:00
commit 15b88e811b
2 changed files with 47 additions and 54 deletions

View File

@ -216,7 +216,7 @@ Default mapping: <leader>gh
:SignifyJumpToNextHunk :SignifyJumpToNextHunk
Jump to the next hunk. There are two mappings available: Jump to the next start of a hunk. There are two mappings available:
Hardcoded mapping: ]c Hardcoded mapping: ]c
Configurable mapping: <leader>gj Configurable mapping: <leader>gj
@ -225,7 +225,7 @@ Configurable mapping: <leader>gj
:SignifyJumpToPrevHunk :SignifyJumpToPrevHunk
Jump to the previous hunk. There are two mappings available: Jump to the previous start of a hunk. There are two mappings available:
Hardcoded mapping: [c Hardcoded mapping: [c
Configurable mapping: <leader>gk Configurable mapping: <leader>gk

View File

@ -159,7 +159,7 @@ function! s:start(path) abort
if empty(diff) if empty(diff)
return return
endif endif
let s:sy[a:path] = { 'active': 1, 'type': type, 'ids': [], 'id_jump': s:id_top, 'id_top': s:id_top, 'last_jump_was_next': -1 } let s:sy[a:path] = { 'active': 1, 'type': type, 'hunks': [], 'id_top': s:id_top }
" Inactive buffer.. bail out. " Inactive buffer.. bail out.
elseif !s:sy[a:path].active elseif !s:sy[a:path].active
return return
@ -171,8 +171,6 @@ function! s:start(path) abort
return return
endif endif
let s:sy[a:path].id_top = s:id_top let s:sy[a:path].id_top = s:id_top
let s:sy[a:path].id_jump = s:id_top
let s:sy[a:path].last_jump_was_next = -1
endif endif
if !exists('s:line_highlight') if !exists('s:line_highlight')
@ -193,8 +191,8 @@ function! s:start(path) abort
sign unplace 99999 sign unplace 99999
if !maparg('[c', 'n') if !maparg('[c', 'n')
nnoremap <buffer><silent> ]c :<c-u>execute v:count .'SignifyJumpToNextHunk'<cr> nnoremap <buffer><silent> ]c :<c-u>execute v:count1 .'SignifyJumpToNextHunk'<cr>
nnoremap <buffer><silent> [c :<c-u>execute v:count .'SignifyJumpToPrevHunk'<cr> nnoremap <buffer><silent> [c :<c-u>execute v:count1 .'SignifyJumpToPrevHunk'<cr>
endif endif
let s:sy[a:path].id_top = (s:id_top - 1) let s:sy[a:path].id_top = (s:id_top - 1)
@ -231,26 +229,32 @@ function! s:sign_get_others(path) abort
endfunction endfunction
" Function: s:sign_set {{{1 " Function: s:sign_set {{{1
function! s:sign_set(lnum, type, path) function! s:sign_set(signs)
let hunk = { 'ids': [], 'start': a:signs[0].lnum, 'end': a:signs[-1].lnum }
for sign in a:signs
" Preserve non-signify signs " Preserve non-signify signs
if !s:sign_overwrite && has_key(s:other_signs_line_numbers, a:lnum) if !s:sign_overwrite && has_key(s:other_signs_line_numbers, sign.lnum)
return next
endif endif
call add(s:sy[a:path].ids, s:id_top) call add(hunk.ids, s:id_top)
execute 'sign place '. s:id_top .' line='. a:lnum .' name='. a:type .' file='. a:path execute 'sign place '. s:id_top .' line='. sign.lnum .' name='. sign.type .' file='. sign.path
let s:id_top += 1 let s:id_top += 1
endfor
call add(s:sy[sign.path].hunks, hunk)
endfunction endfunction
" Function: s:sign_remove_all {{{1 " Function: s:sign_remove_all {{{1
function! s:sign_remove_all(path) abort function! s:sign_remove_all(path) abort
for id in s:sy[a:path].ids for hunk in s:sy[a:path].hunks
for id in hunk.ids
execute 'sign unplace '. id execute 'sign unplace '. id
endfor endfor
endfor
let s:other_signs_line_numbers = {} let s:other_signs_line_numbers = {}
let s:sy[a:path].ids = [] let s:sy[a:path].hunks = []
endfunction endfunction
" Function: s:repo_detect {{{1 " Function: s:repo_detect {{{1
@ -337,6 +341,8 @@ function! s:repo_process_diff(path, diff) abort
let [ old_line, old_count, new_line, new_count ] = [ str2nr(tokens[1]), empty(tokens[2]) ? 1 : str2nr(tokens[2]), str2nr(tokens[3]), empty(tokens[4]) ? 1 : str2nr(tokens[4]) ] let [ old_line, old_count, new_line, new_count ] = [ str2nr(tokens[1]), empty(tokens[2]) ? 1 : str2nr(tokens[2]), str2nr(tokens[3]), empty(tokens[4]) ? 1 : str2nr(tokens[4]) ]
let signs = []
" 2 lines added: " 2 lines added:
" @@ -5,0 +6,2 @@ this is line 5 " @@ -5,0 +6,2 @@ this is line 5
@ -346,7 +352,7 @@ function! s:repo_process_diff(path, diff) abort
if (old_count == 0) && (new_count >= 1) if (old_count == 0) && (new_count >= 1)
let offset = 0 let offset = 0
while offset < new_count while offset < new_count
call s:sign_set(new_line + offset, 'SignifyAdd', a:path) call add(signs, { 'type': 'SignifyAdd', 'lnum': new_line + offset, 'path': a:path })
let offset += 1 let offset += 1
endwhile endwhile
@ -358,9 +364,9 @@ function! s:repo_process_diff(path, diff) abort
elseif (old_count >= 1) && (new_count == 0) elseif (old_count >= 1) && (new_count == 0)
if new_line == 0 if new_line == 0
call s:sign_set(1, 'SignifyDeleteFirstLine', a:path) call add(signs, { 'type': 'SignifyDeleteFirstLine', 'lnum': 1, 'path': a:path })
else else
call s:sign_set(new_line, (old_count > 9) ? 'SignifyDeleteMore' : 'SignifyDelete'. old_count, a:path) call add(signs, { 'type': (old_count > 9) ? 'SignifyDeleteMore' : 'SignifyDelete' . old_count, 'lnum': new_line, 'path': a:path })
endif endif
" 2 lines changed: " 2 lines changed:
@ -374,7 +380,7 @@ function! s:repo_process_diff(path, diff) abort
elseif old_count == new_count elseif old_count == new_count
let offset = 0 let offset = 0
while offset < new_count while offset < new_count
call s:sign_set(new_line + offset, 'SignifyChange', a:path) call add(signs, { 'type': 'SignifyChange', 'lnum': new_line + offset, 'path': a:path })
let offset += 1 let offset += 1
endwhile endwhile
else else
@ -392,10 +398,10 @@ function! s:repo_process_diff(path, diff) abort
if old_count > new_count if old_count > new_count
let offset = 0 let offset = 0
while offset < (new_count - 1) while offset < (new_count - 1)
call s:sign_set(new_line + offset, 'SignifyChange', a:path) call add(signs, { 'type': 'SignifyChange', 'lnum': new_line + offset, 'path': a:path })
let offset += 1 let offset += 1
endwhile endwhile
call s:sign_set(new_line + offset, 'SignifyChangeDelete', a:path) call add(signs, { 'type': 'SignifyChangeDelete', 'lnum': new_line + offset, 'path': a:path })
" lines changed and added: " lines changed and added:
@ -408,15 +414,16 @@ function! s:repo_process_diff(path, diff) abort
else else
let offset = 0 let offset = 0
while offset < old_count while offset < old_count
call s:sign_set(new_line + offset, 'SignifyChange', a:path) call add(signs, { 'type': 'SignifyChange', 'lnum': new_line + offset, 'path': a:path })
let offset += 1 let offset += 1
endwhile endwhile
while offset < new_count while offset < new_count
call s:sign_set(new_line + offset, 'SignifyAdd', a:path) call add(signs, { 'type': 'SignifyAdd', 'lnum': new_line + offset, 'path': a:path })
let offset += 1 let offset += 1
endwhile endwhile
endif endif
endif endif
call s:sign_set(signs)
endfor endfor
endfunction endfunction
@ -479,48 +486,34 @@ endfunction
" Function: s:jump_to_next_hunk {{{1 " Function: s:jump_to_next_hunk {{{1
function! s:jump_to_next_hunk(count) function! s:jump_to_next_hunk(count)
if !has_key(s:sy, s:path) || s:sy[s:path].id_jump == -1 if !has_key(s:sy, s:path)
echomsg 'signify: I cannot detect any changes!' echomsg 'signify: I cannot detect any changes!'
return return
endif endif
if s:sy[s:path].last_jump_was_next == 0 let lnum = line('.')
let s:sy[s:path].id_jump += 2 let hunks = filter(copy(s:sy[s:path].hunks), 'v:val.start > lnum')
let hunk = get(hunks, a:count - 1, {})
if !empty(hunk)
execute 'sign jump '. hunk.ids[0] .' file='. s:path
endif endif
let s:sy[s:path].id_jump += a:count ? (a:count - 1) : 0
if s:sy[s:path].id_jump > s:sy[s:path].id_top
let s:sy[s:path].id_jump = s:sy[s:path].ids[0]
endif
execute 'sign jump '. s:sy[s:path].id_jump .' file='. s:path
let s:sy[s:path].id_jump += 1
let s:sy[s:path].last_jump_was_next = 1
endfunction endfunction
" Function: s:jump_to_prev_hunk {{{1 " Function: s:jump_to_prev_hunk {{{1
function! s:jump_to_prev_hunk(count) function! s:jump_to_prev_hunk(count)
if !has_key(s:sy, s:path) || s:sy[s:path].id_jump == -1 if !has_key(s:sy, s:path)
echomsg 'signify: I cannot detect any changes!' echomsg 'signify: I cannot detect any changes!'
return return
endif endif
if s:sy[s:path].last_jump_was_next == 1 let lnum = line('.')
let s:sy[s:path].id_jump -= 2 let hunks = filter(copy(s:sy[s:path].hunks), 'v:val.start < lnum')
let hunk = get(hunks, 0 - a:count, {})
if !empty(hunk)
execute 'sign jump '. hunk.ids[0] .' file='. s:path
endif endif
let s:sy[s:path].id_jump -= a:count ? (a:count - 1) : 0
if s:sy[s:path].id_jump < s:sy[s:path].ids[0]
let s:sy[s:path].id_jump = s:sy[s:path].id_top
endif
execute 'sign jump '. s:sy[s:path].id_jump .' file='. s:path
let s:sy[s:path].id_jump -= 1
let s:sy[s:path].last_jump_was_next = 0
endfunction endfunction
" Function: s:escape {{{1 " Function: s:escape {{{1