aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJurica Bradaric <jbradaric@gmail.com>2016-01-30 20:55:38 +0100
committerJurica Bradaric <jbradaric@gmail.com>2016-01-30 21:31:11 +0100
commit7d2d4b1918fe2a413d5b5618bacfc78ccaae5414 (patch)
tree3391095a8a0aa4802704a5a1d53c44dd9b43a19c /src
parent8f22031708b351ec5bb73952e6afc39b07a72ae2 (diff)
downloadrneovim-7d2d4b1918fe2a413d5b5618bacfc78ccaae5414.tar.gz
rneovim-7d2d4b1918fe2a413d5b5618bacfc78ccaae5414.tar.bz2
rneovim-7d2d4b1918fe2a413d5b5618bacfc78ccaae5414.zip
vim-patch:7.4.771
Problem: Search does not handle multi-byte character at the start position correctly. Solution: Take byte size of character into account. (Yukihiro Nakadaira) https://github.com/vim/vim/commit/5f1e68b7bc241118e5dd8fc781147fdda881ada8
Diffstat (limited to 'src')
-rw-r--r--src/nvim/search.c22
-rw-r--r--src/nvim/version.c2
2 files changed, 14 insertions, 10 deletions
diff --git a/src/nvim/search.c b/src/nvim/search.c
index d393ee7d02..f2420e282c 100644
--- a/src/nvim/search.c
+++ b/src/nvim/search.c
@@ -497,6 +497,7 @@ int searchit(
pos_T start_pos;
int at_first_line;
int extra_col;
+ int start_char_len;
int match_ok;
long nmatched;
int submatch = 0;
@@ -519,16 +520,21 @@ int searchit(
// When not accepting a match at the start position set "extra_col" to a
// non-zero value. Don't do that when starting at MAXCOL, since MAXCOL + 1
// is zero.
- if ((options & SEARCH_START) || pos->col == MAXCOL) {
- extra_col = 0;
- } else if (dir != BACKWARD && has_mbyte
+ if (pos->col == MAXCOL) {
+ start_char_len = 0;
+ } else if (has_mbyte
&& pos->lnum >= 1 && pos->lnum <= buf->b_ml.ml_line_count
&& pos->col < MAXCOL - 2) {
// Watch out for the "col" being MAXCOL - 2, used in a closed fold.
ptr = ml_get_buf(buf, pos->lnum, FALSE) + pos->col;
- extra_col = *ptr == NUL ? 1 : (*mb_ptr2len)(ptr);
+ start_char_len = *ptr == NUL ? 1 : (*mb_ptr2len)(ptr);
} else {
- extra_col = 1;
+ start_char_len = 1;
+ }
+ if (dir == FORWARD) {
+ extra_col = (options & SEARCH_START) ? 0 : start_char_len;
+ } else {
+ extra_col = (options & SEARCH_START) ? start_char_len : 0;
}
start_pos = *pos; /* remember start pos for detecting no match */
@@ -679,15 +685,13 @@ int searchit(
|| (lnum + regmatch.endpos[0].lnum
== start_pos.lnum
&& (int)regmatch.endpos[0].col - 1
- + extra_col
- <= (int)start_pos.col))
+ < (int)start_pos.col + extra_col))
: (lnum + regmatch.startpos[0].lnum
< start_pos.lnum
|| (lnum + regmatch.startpos[0].lnum
== start_pos.lnum
&& (int)regmatch.startpos[0].col
- + extra_col
- <= (int)start_pos.col)))) {
+ < (int)start_pos.col + extra_col)))) {
match_ok = TRUE;
matchpos = regmatch.startpos[0];
endpos = regmatch.endpos[0];
diff --git a/src/nvim/version.c b/src/nvim/version.c
index 30f104562f..feda3edde0 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -363,7 +363,7 @@ static int included_patches[] = {
774,
773,
// 772 NA
- // 771,
+ 771,
// 770 NA
// 769,
// 768,