diff options
author | Bram Moolenaar <Bram@vim.org> | 2015-02-17 15:43:57 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2015-02-17 15:43:57 +0100 |
commit | 4653911950e8bedff444adc9a2dcbebd9b36dc07 (patch) | |
tree | 6a26b560ba846992e0773e2b503ec030f85bbac6 /src | |
parent | 05eb612ff3597fb7102f892bfd320f28b56d2fc6 (diff) |
updated for version 7.4.636v7.4.636
Problem: A search with end offset gets stuck at end of file. (Gary Johnson)
Solution: When a search doesn't move the cursor repeat it with a higher
count. (Christian Brabandt)
Diffstat (limited to 'src')
-rw-r--r-- | src/normal.c | 23 | ||||
-rw-r--r-- | src/testdir/test44.in | 6 | ||||
-rw-r--r-- | src/testdir/test44.ok | 2 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 28 insertions, 5 deletions
diff --git a/src/normal.c b/src/normal.c index 74a001e823..86d4504a91 100644 --- a/src/normal.c +++ b/src/normal.c @@ -100,7 +100,7 @@ static void nv_end __ARGS((cmdarg_T *cap)); static void nv_dollar __ARGS((cmdarg_T *cap)); static void nv_search __ARGS((cmdarg_T *cap)); static void nv_next __ARGS((cmdarg_T *cap)); -static void normal_search __ARGS((cmdarg_T *cap, int dir, char_u *pat, int opt)); +static int normal_search __ARGS((cmdarg_T *cap, int dir, char_u *pat, int opt)); static void nv_csearch __ARGS((cmdarg_T *cap)); static void nv_brackets __ARGS((cmdarg_T *cap)); static void nv_percent __ARGS((cmdarg_T *cap)); @@ -5765,7 +5765,7 @@ nv_ident(cap) init_history(); add_to_history(HIST_SEARCH, buf, TRUE, NUL); #endif - normal_search(cap, cmdchar == '*' ? '/' : '?', buf, 0); + (void)normal_search(cap, cmdchar == '*' ? '/' : '?', buf, 0); } else do_cmdline_cmd(buf); @@ -6301,7 +6301,7 @@ nv_search(cap) return; } - normal_search(cap, cap->cmdchar, cap->searchbuf, + (void)normal_search(cap, cap->cmdchar, cap->searchbuf, (cap->arg ? 0 : SEARCH_MARK)); } @@ -6313,14 +6313,26 @@ nv_search(cap) nv_next(cap) cmdarg_T *cap; { - normal_search(cap, 0, NULL, SEARCH_MARK | cap->arg); + pos_T old = curwin->w_cursor; + int i = normal_search(cap, 0, NULL, SEARCH_MARK | cap->arg); + + if (i == 1 && equalpos(old, curwin->w_cursor)) + { + /* Avoid getting stuck on the current cursor position, which can + * happen when an offset is given and the cursor is on the last char + * in the buffer: Repeat with count + 1. */ + cap->count1 += 1; + (void)normal_search(cap, 0, NULL, SEARCH_MARK | cap->arg); + cap->count1 -= 1; + } } /* * Search for "pat" in direction "dir" ('/' or '?', 0 for repeat). * Uses only cap->count1 and cap->oap from "cap". + * Return 0 for failure, 1 for found, 2 for found and line offset added. */ - static void + static int normal_search(cap, dir, pat, opt) cmdarg_T *cap; int dir; @@ -6354,6 +6366,7 @@ normal_search(cap, dir, pat, opt) /* "/$" will put the cursor after the end of the line, may need to * correct that here */ check_cursor(); + return i; } /* diff --git a/src/testdir/test44.in b/src/testdir/test44.in index 87de1b95a4..69fbb9434e 100644 --- a/src/testdir/test44.in +++ b/src/testdir/test44.in @@ -42,6 +42,12 @@ G:put =matchstr(\"אבגד\", \".\", 0, 2) " ב :put =matchstr(\"אבגד\", \"..\", 0, 2) " בג :put =matchstr(\"אבגד\", \".\", 0, 0) " א :put =matchstr(\"אבגד\", \".\", 4, -1) " ג +:new +:$put =['dog(a', 'cat('] +/(/e+ +"ayn:bd! +:$put ='' +G"ap :w! :qa! ENDTEST diff --git a/src/testdir/test44.ok b/src/testdir/test44.ok index 0bd0b8ab73..d9a1206cc2 100644 --- a/src/testdir/test44.ok +++ b/src/testdir/test44.ok @@ -22,3 +22,5 @@ k œ̄ṣ́m̥̄ᾱ̆́ בג א ג +a +cat( diff --git a/src/version.c b/src/version.c index 0c2004116e..226386ac5d 100644 --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 636, +/**/ 635, /**/ 634, |