1
0
forked from aniani/vim

patch 8.0.1037: "icase" of 'diffopt' is not used for highlighting

Problem:    "icase" of 'diffopt' is not used for highlighting differences.
Solution:   Also use "icase". (Rick Howe)
This commit is contained in:
Bram Moolenaar
2017-09-02 18:01:50 +02:00
parent dada6d2a8e
commit da22b8cc8b
3 changed files with 59 additions and 8 deletions

View File

@@ -1949,6 +1949,40 @@ diffopt_horizontal(void)
return (diff_flags & DIFF_HORIZONTAL) != 0; return (diff_flags & DIFF_HORIZONTAL) != 0;
} }
/*
* Compare the characters at "p1" and "p2". If they are equal (possibly
* ignoring case) return TRUE and set "len" to the number of bytes.
*/
static int
diff_equal_char(char_u *p1, char_u *p2, int *len)
{
#ifdef FEAT_MBYTE
int l = (*mb_ptr2len)(p1);
if (l != (*mb_ptr2len)(p2))
return FALSE;
if (l > 1)
{
if (STRNCMP(p1, p2, l) != 0
&& (!enc_utf8
|| !(diff_flags & DIFF_ICASE)
|| utf_fold(utf_ptr2char(p1))
!= utf_fold(utf_ptr2char(p2))))
return FALSE;
*len = l;
}
else
#endif
{
if ((*p1 != *p2)
&& (!(diff_flags & DIFF_ICASE)
|| TOLOWER_LOC(*p1) != TOLOWER_LOC(*p2)))
return FALSE;
*len = 1;
}
return TRUE;
}
/* /*
* Find the difference within a changed line. * Find the difference within a changed line.
* Returns TRUE if the line was added, no other buffer has it. * Returns TRUE if the line was added, no other buffer has it.
@@ -1969,6 +2003,10 @@ diff_find_change(
int idx; int idx;
int off; int off;
int added = TRUE; int added = TRUE;
#ifdef FEAT_MBYTE
char_u *p1, *p2;
int l;
#endif
/* Make a copy of the line, the next ml_get() will invalidate it. */ /* Make a copy of the line, the next ml_get() will invalidate it. */
line_org = vim_strsave(ml_get_buf(wp->w_buffer, lnum, FALSE)); line_org = vim_strsave(ml_get_buf(wp->w_buffer, lnum, FALSE));
@@ -2017,10 +2055,11 @@ diff_find_change(
} }
else else
{ {
if (line_org[si_org] != line_new[si_new]) if (!diff_equal_char(line_org + si_org, line_new + si_new,
&l))
break; break;
++si_org; si_org += l;
++si_new; si_new += l;
} }
} }
#ifdef FEAT_MBYTE #ifdef FEAT_MBYTE
@@ -2056,10 +2095,16 @@ diff_find_change(
} }
else else
{ {
if (line_org[ei_org] != line_new[ei_new]) p1 = line_org + ei_org;
p2 = line_new + ei_new;
#ifdef FEAT_MBYTE
p1 -= (*mb_head_off)(line_org, p1);
p2 -= (*mb_head_off)(line_new, p2);
#endif
if (!diff_equal_char(p1, p2, &l))
break; break;
--ei_org; ei_org -= l;
--ei_new; ei_new -= l;
} }
} }
if (*endp < ei_org) if (*endp < ei_org)

View File

@@ -280,13 +280,13 @@ func Test_diffopt_icase()
set diffopt=icase,foldcolumn:0 set diffopt=icase,foldcolumn:0
e one e one
call setline(1, ['One', 'Two', 'Three', 'Four']) call setline(1, ['One', 'Two', 'Three', 'Four', 'Fi#ve'])
redraw redraw
let normattr = screenattr(1, 1) let normattr = screenattr(1, 1)
diffthis diffthis
botright vert new two botright vert new two
call setline(1, ['one', 'TWO', 'Three ', 'Four']) call setline(1, ['one', 'TWO', 'Three ', 'Four', 'fI=VE'])
diffthis diffthis
redraw redraw
@@ -295,6 +295,10 @@ func Test_diffopt_icase()
call assert_notequal(normattr, screenattr(3, 1)) call assert_notequal(normattr, screenattr(3, 1))
call assert_equal(normattr, screenattr(4, 1)) call assert_equal(normattr, screenattr(4, 1))
let dtextattr = screenattr(5, 3)
call assert_notequal(dtextattr, screenattr(5, 1))
call assert_notequal(dtextattr, screenattr(5, 5))
diffoff! diffoff!
%bwipe! %bwipe!
set diffopt& set diffopt&

View File

@@ -769,6 +769,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1037,
/**/ /**/
1036, 1036,
/**/ /**/