]> granicus.if.org Git - vim/commitdiff
patch 8.0.1037: "icase" of 'diffopt' is not used for highlighting v8.0.1037
authorBram Moolenaar <Bram@vim.org>
Sat, 2 Sep 2017 16:01:50 +0000 (18:01 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 2 Sep 2017 16:01:50 +0000 (18:01 +0200)
Problem:    "icase" of 'diffopt' is not used for highlighting differences.
Solution:   Also use "icase". (Rick Howe)

src/diff.c
src/testdir/test_diffmode.vim
src/version.c

index dac39c21e89dcd5e84059feb700a76ada52ed089..cd3ffa48f12ecba1cfb252f4f58205d316f3182a 100644 (file)
@@ -1949,6 +1949,40 @@ diffopt_horizontal(void)
     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.
  * Returns TRUE if the line was added, no other buffer has it.
@@ -1969,6 +2003,10 @@ diff_find_change(
     int                idx;
     int                off;
     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. */
     line_org = vim_strsave(ml_get_buf(wp->w_buffer, lnum, FALSE));
@@ -2017,10 +2055,11 @@ diff_find_change(
                }
                else
                {
-                   if (line_org[si_org] != line_new[si_new])
+                   if (!diff_equal_char(line_org + si_org, line_new + si_new,
+                                                                          &l))
                        break;
-                   ++si_org;
-                   ++si_new;
+                   si_org += l;
+                   si_new += l;
                }
            }
 #ifdef FEAT_MBYTE
@@ -2056,10 +2095,16 @@ diff_find_change(
                    }
                    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;
-                       --ei_org;
-                       --ei_new;
+                       ei_org -= l;
+                       ei_new -= l;
                    }
                }
                if (*endp < ei_org)
index 088ec5ccf60d8a6c5537c22e49f49988766a3d72..3625a68e5a7b705869546daca29e0181745de860 100644 (file)
@@ -280,13 +280,13 @@ func Test_diffopt_icase()
   set diffopt=icase,foldcolumn:0
 
   e one
-  call setline(1, ['One', 'Two', 'Three', 'Four'])
+  call setline(1, ['One', 'Two', 'Three', 'Four', 'Fi#ve'])
   redraw
   let normattr = screenattr(1, 1)
   diffthis
 
   botright vert new two
-  call setline(1, ['one', 'TWO', 'Three ', 'Four'])
+  call setline(1, ['one', 'TWO', 'Three ', 'Four', 'fI=VE'])
   diffthis
 
   redraw
@@ -295,6 +295,10 @@ func Test_diffopt_icase()
   call assert_notequal(normattr, screenattr(3, 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!
   %bwipe!
   set diffopt&
index 579f0a2b60009c9051875b893d6d9646ea27179b..8af46882e458e2346ddbb4f98d9ac382b1175e72 100644 (file)
@@ -769,6 +769,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1037,
 /**/
     1036,
 /**/