@@ -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)
0 commit comments