Skip to content

Commit b2a0450

Browse files
authored
Merge pull request mhinz#361 from KapJI/fix-signs
Cover more cases in hunk processing to display signs
2 parents d80e507 + 60a27c5 commit b2a0450

File tree

3 files changed

+64
-12
lines changed

3 files changed

+64
-12
lines changed

autoload/sy/highlight.vim

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ if get(g:, 'signify_sign_show_text', 1)
77
let s:sign_add = get(g:, 'signify_sign_add', '+')
88
let s:sign_delete_first_line = get(g:, 'signify_sign_delete_first_line', '')
99
let s:sign_change = get(g:, 'signify_sign_change', '!')
10+
let s:sign_change_delete = get(g:, 'signify_sign_change_delete', s:sign_change . s:sign_delete_first_line)
1011
else
1112
let s:sign_add = ' '
1213
let s:sign_delete_first_line = ' '
1314
let s:sign_change = ' '
15+
let s:sign_change_delete = ' '
1416
endif
1517

1618
let s:sign_show_count = get(g:, 'signify_sign_show_count', 1)
@@ -22,17 +24,20 @@ function! sy#highlight#setup() abort
2224
highlight default link SignifyLineDelete DiffDelete
2325
highlight default link SignifyLineDeleteFirstLine SignifyLineDelete
2426
highlight default link SignifyLineChange DiffChange
27+
highlight default link SignifyLineChangeDelete SignifyLineChange
2528

2629
highlight default link SignifySignAdd DiffAdd
2730
highlight default link SignifySignDelete DiffDelete
2831
highlight default link SignifySignDeleteFirstLine SignifySignDelete
2932
highlight default link SignifySignChange DiffChange
33+
highlight default link SignifySignChangeDelete SignifySignChange
3034
endfunction
3135

3236
" #line_enable {{{1
3337
function! sy#highlight#line_enable() abort
3438
execute 'sign define SignifyAdd text='. s:sign_add 'texthl=SignifySignAdd linehl=SignifyLineAdd'
3539
execute 'sign define SignifyChange text='. s:sign_change 'texthl=SignifySignChange linehl=SignifyLineChange'
40+
execute 'sign define SignifyChangeDelete text='. s:sign_change_delete 'texthl=SignifySignChangeDelete linehl=SignifyLineChangeDelete'
3641
execute 'sign define SignifyRemoveFirstLine text='. s:sign_delete_first_line 'texthl=SignifySignDeleteFirstLine linehl=SignifyLineDeleteFirstLine'
3742
let g:signify_line_highlight = 1
3843
endfunction
@@ -41,6 +46,7 @@ endfunction
4146
function! sy#highlight#line_disable() abort
4247
execute 'sign define SignifyAdd text='. s:sign_add 'texthl=SignifySignAdd linehl='
4348
execute 'sign define SignifyChange text='. s:sign_change 'texthl=SignifySignChange linehl='
49+
execute 'sign define SignifyChangeDelete text='. s:sign_change_delete 'texthl=SignifySignChangeDelete linehl='
4450
execute 'sign define SignifyRemoveFirstLine text='. s:sign_delete_first_line 'texthl=SignifySignDeleteFirstLine linehl='
4551
let g:signify_line_highlight = 0
4652
endfunction

autoload/sy/sign.vim

Lines changed: 53 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ function! sy#sign#process_diff(sy, vcs, diff) abort
8282
" @@ -5,0 +6,2 @@ this is line 5
8383
" +this is line 5
8484
" +this is line 5
85-
if (old_count == 0) && (new_count >= 1)
85+
if old_count == 0 && new_count > 0
8686
let added += new_count
8787
let offset = 0
8888
while offset < new_count
@@ -97,7 +97,7 @@ function! sy#sign#process_diff(sy, vcs, diff) abort
9797
" @@ -6,2 +5,0 @@ this is line 5
9898
" -this is line 6
9999
" -this is line 7
100-
elseif (old_count >= 1) && (new_count == 0)
100+
elseif old_count > 0 && new_count == 0
101101
if s:external_sign_present(a:sy, new_line) | continue | endif
102102
let deleted += old_count
103103
if new_line == 0
@@ -111,22 +111,63 @@ function! sy#sign#process_diff(sy, vcs, diff) abort
111111
else
112112
call add(ids, s:add_sign(a:sy, new_line, 'SignifyDeleteMore', s:sign_delete))
113113
endif
114-
115-
" There are additions and deletions, however we don't know which lines are
116-
" 'changed' and which are new so we just show the whole block as changed.
117-
"
118-
" With sufficiently smart heuristics we could see which lines are the most
119-
" dissimilar to the previous lines and mark them as additions but for now
120-
" we will not do that.
121-
else
122-
let modified += old_count
123-
let offset = 0
114+
" All lines are modified.
115+
elseif old_count > 0 && new_count > 0 && old_count == new_count
116+
let modified += new_count
117+
let offset = 0
124118
while offset < new_count
125119
let line = new_line + offset
126120
let offset += 1
127121
if s:external_sign_present(a:sy, line) | continue | endif
128122
call add(ids, s:add_sign(a:sy, line, 'SignifyChange'))
129123
endwhile
124+
" Some lines are modified and some new lines are added.
125+
elseif old_count > 0 && new_count > 0 && old_count < new_count
126+
let modified += old_count
127+
let added += new_count - old_count
128+
let offset = 0
129+
while offset < old_count
130+
let line = new_line + offset
131+
let offset += 1
132+
if s:external_sign_present(a:sy, line) | continue | endif
133+
call add(ids, s:add_sign(a:sy, line, 'SignifyChange'))
134+
endwhile
135+
while offset < new_count
136+
let line = new_line + offset
137+
let offset += 1
138+
if s:external_sign_present(a:sy, line) | continue | endif
139+
call add(ids, s:add_sign(a:sy, line, 'SignifyAdd'))
140+
endwhile
141+
" Some lines are modified and some lines are deleted.
142+
elseif old_count > 0 && new_count > 0 && old_count > new_count
143+
let modified += new_count
144+
let deleted_count = old_count - new_count
145+
let deleted += deleted_count
146+
147+
let prev_line_available = new_line > 1 && !get(a:sy.signtable, new_line - 1, 0)
148+
if prev_line_available
149+
if s:sign_show_count
150+
let text = s:sign_delete . (deleted_count <= 99 ? deleted_count : '>')
151+
while strwidth(text) > 2
152+
let text = substitute(text, '.', '', '')
153+
endwhile
154+
call add(ids, s:add_sign(a:sy, new_line - 1, 'SignifyDelete'. deleted_count, text))
155+
else
156+
call add(ids, s:add_sign(a:sy, new_line - 1, 'SignifyDeleteMore', s:sign_delete))
157+
endif
158+
endif
159+
160+
let offset = 0
161+
while offset < new_count
162+
let line = new_line + offset
163+
if s:external_sign_present(a:sy, line) | continue | endif
164+
if !prev_line_available && offset == 0
165+
call add(ids, s:add_sign(a:sy, line, 'SignifyChangeDelete'))
166+
else
167+
call add(ids, s:add_sign(a:sy, line, 'SignifyChange'))
168+
endif
169+
let offset += 1
170+
endwhile
130171
endif
131172

132173
if !empty(ids)

doc/signify.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ default values, as long as no "Default:" section is given.
131131
|g:signify_sign_delete|
132132
|g:signify_sign_delete_first_line|
133133
|g:signify_sign_change|
134+
|g:signify_sign_change_delete|
134135
|g:signify_sign_show_count|
135136
|g:signify_sign_show_text|
136137
|g:signify_difftool|
@@ -267,11 +268,13 @@ Enable line highlighting in addition to using signs by default.
267268
*g:signify_sign_delete*
268269
*g:signify_sign_delete_first_line*
269270
*g:signify_sign_change*
271+
*g:signify_sign_change_delete*
270272
>
271273
let g:signify_sign_add = '+'
272274
let g:signify_sign_delete = '_'
273275
let g:signify_sign_delete_first_line = '‾'
274276
let g:signify_sign_change = '!'
277+
let g:signify_sign_change_delete = g:signify_sign_change . g:signify_sign_delete_first_line
275278
<
276279
The sign to use if a line was added, deleted or changed or a combination of
277280
these.
@@ -548,11 +551,13 @@ highlighting groups: |hl-DiffAdd|, |hl-DiffChange|, |hl-DiffDelete|:
548551
>
549552
highlight link SignifyLineAdd DiffAdd
550553
highlight link SignifyLineChange DiffChange
554+
highlight link SignifyLineChangeDelete SignifyLineChange
551555
highlight link SignifyLineDelete DiffDelete
552556
highlight link SignifyLineDeleteFirstLine SignifyLineDelete
553557

554558
highlight link SignifySignAdd DiffAdd
555559
highlight link SignifySignChange DiffChange
560+
highlight link SignifySignChangeDelete SignifySignChange
556561
highlight link SignifySignDelete DiffDelete
557562
highlight link SignifySignDeleteFirstLine SignifySignDelete
558563
<

0 commit comments

Comments
 (0)