diff options
author | Jan Edmund Lazo <janedmundlazo@hotmail.com> | 2018-08-10 16:39:21 -0400 |
---|---|---|
committer | Jan Edmund Lazo <janedmundlazo@hotmail.com> | 2018-08-11 14:54:39 -0400 |
commit | 4f93d05d3985d90701fa9dace22daee82b4e48f9 (patch) | |
tree | eefafbc6f4035e287734a11d688308df7d188471 /src/nvim/diff.c | |
parent | 22311457ab60be9335f8e630c8b794340d39e466 (diff) | |
download | rneovim-4f93d05d3985d90701fa9dace22daee82b4e48f9.tar.gz rneovim-4f93d05d3985d90701fa9dace22daee82b4e48f9.tar.bz2 rneovim-4f93d05d3985d90701fa9dace22daee82b4e48f9.zip |
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)
https://github.com/vim/vim/commit/da22b8cc8b1b96fabd5a4c35c57b04a351340fb1
Diffstat (limited to 'src/nvim/diff.c')
-rw-r--r-- | src/nvim/diff.c | 48 |
1 files changed, 42 insertions, 6 deletions
diff --git a/src/nvim/diff.c b/src/nvim/diff.c index 8699c16351..7b06609fc3 100644 --- a/src/nvim/diff.c +++ b/src/nvim/diff.c @@ -1870,6 +1870,35 @@ bool 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 bool diff_equal_char(const char_u *const p1, const char_u *const p2, + int *const len) +{ + const int l = utfc_ptr2len(p1); + + if (l != utfc_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 { + 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. /// /// @param wp window whose current buffer to check @@ -1887,6 +1916,7 @@ bool diff_find_change(win_T *wp, linenr_T lnum, int *startp, int *endp) int ei_org; int ei_new; bool added = true; + int l; // Make a copy of the line, the next ml_get() will invalidate it. char_u *line_org = vim_strsave(ml_get_buf(wp->w_buffer, lnum, FALSE)); @@ -1933,11 +1963,11 @@ bool diff_find_change(win_T *wp, linenr_T lnum, int *startp, int *endp) si_org = (int)(skipwhite(line_org + si_org) - line_org); si_new = (int)(skipwhite(line_new + si_new) - line_new); } 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; } } @@ -1972,11 +2002,17 @@ bool diff_find_change(win_T *wp, linenr_T lnum, int *startp, int *endp) ei_new--; } } else { - if (line_org[ei_org] != line_new[ei_new]) { + const char_u *p1 = line_org + ei_org; + const char_u *p2 = line_new + ei_new; + + p1 -= utf_head_off(line_org, p1); + p2 -= utf_head_off(line_new, p2); + + if (!diff_equal_char(p1, p2, &l)) { break; } - ei_org--; - ei_new--; + ei_org -= l; + ei_new -= l; } } |