diff options
author | Bram Moolenaar <Bram@vim.org> | 2018-09-06 21:44:17 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2018-09-06 21:44:17 +0200 |
commit | 198cb66d652d3d8ac16226dcc929a11b0b720151 (patch) | |
tree | 23ab498998bff1956e3d4e658918843dc7566db0 /src | |
parent | 0b1468884a2a1c5d3442cbb7119330e307f0aa3d (diff) |
patch 8.1.0351: 'incsearch' for :/foo/s//<Esc> changes last search patternv8.1.0351
Problem: 'incsearch' for :/foo/s//<Esc> changes last search pattern.
Solution: Save the last search pattern earlier.
Diffstat (limited to 'src')
-rw-r--r-- | src/ex_docmd.c | 4 | ||||
-rw-r--r-- | src/ex_getln.c | 23 | ||||
-rw-r--r-- | src/testdir/test_search.vim | 17 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 43 insertions, 3 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c index 5b53785cc5..767791776e 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -2911,6 +2911,7 @@ free_cmdmod(void) /* * Parse the address range, if any, in "eap". + * May set the last search pattern. * Return FAIL and set "errormsg" or return OK. */ int @@ -4436,10 +4437,11 @@ skip_range( } /* - * get a single EX address + * Get a single EX address. * * Set ptr to the next character after the part that was interpreted. * Set ptr to NULL when an error is encountered. + * This may set the last used search pattern. * * Return MAXLNUM when no Ex address was found. */ diff --git a/src/ex_getln.c b/src/ex_getln.c index c316e192ad..80f210a5b0 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -271,6 +271,7 @@ set_search_match(pos_T *t) /* * Return TRUE when 'incsearch' highlighting is to be done. * Sets search_first_line and search_last_line to the address range. + * May change the last search pattern. */ static int do_incsearch_highlighting(int firstc, incsearch_state_T *is_state, @@ -470,8 +471,12 @@ may_do_incsearch_highlighting( int next_char; int use_last_pat; + // Parsing range may already set the last search pattern. + save_last_search_pattern(); + if (!do_incsearch_highlighting(firstc, is_state, &skiplen, &patlen)) { + restore_last_search_pattern(); finish_incsearch_highlighting(FALSE, is_state, TRUE); return; } @@ -479,6 +484,7 @@ may_do_incsearch_highlighting( // If there is a character waiting, search and redraw later. if (char_avail()) { + restore_last_search_pattern(); is_state->incsearch_postponed = TRUE; return; } @@ -493,7 +499,6 @@ may_do_incsearch_highlighting( curwin->w_cursor.lnum = search_first_line; curwin->w_cursor.col = 0; } - save_last_search_pattern(); // Use the previous pattern for ":s//". next_char = ccline.cmdbuff[skiplen + patlen]; @@ -627,10 +632,19 @@ may_adjust_incsearch_highlighting( int i; int save; + // Parsing range may already set the last search pattern. + save_last_search_pattern(); + if (!do_incsearch_highlighting(firstc, is_state, &skiplen, &patlen)) + { + restore_last_search_pattern(); return OK; + } if (patlen == 0 && ccline.cmdbuff[skiplen] == NUL) + { + restore_last_search_pattern(); return FAIL; + } if (firstc == ccline.cmdbuff[skiplen]) { @@ -641,7 +655,6 @@ may_adjust_incsearch_highlighting( else pat = ccline.cmdbuff + skiplen; - save_last_search_pattern(); cursor_off(); out_flush(); if (c == Ctrl_G) @@ -721,8 +734,14 @@ may_add_char_to_search(int firstc, int *c, incsearch_state_T *is_state) { int skiplen, patlen; + // Parsing range may already set the last search pattern. + save_last_search_pattern(); + if (!do_incsearch_highlighting(firstc, is_state, &skiplen, &patlen)) + { + restore_last_search_pattern(); return FAIL; + } // Add a character from under the cursor for 'incsearch'. if (is_state->did_incsearch) diff --git a/src/testdir/test_search.vim b/src/testdir/test_search.vim index 68dc3ec8e8..f96e54abe2 100644 --- a/src/testdir/test_search.vim +++ b/src/testdir/test_search.vim @@ -1043,6 +1043,23 @@ func Test_incsearch_vimgrep_dump() call delete('Xis_vimgrep_script') endfunc +func Test_keep_last_search_pattern() + if !exists('+incsearch') + return + endif + new + call setline(1, ['foo', 'foo', 'foo']) + set incsearch + call test_override("char_avail", 1) + let @/ = 'bar' + call feedkeys(":/foo/s//\<Esc>", 'ntx') + call assert_equal('bar', @/) + + bwipe! + call test_override("ALL", 0) + set noincsearch +endfunc + func Test_search_undefined_behaviour() if !has("terminal") return diff --git a/src/version.c b/src/version.c index 292af60f53..ba1ac1a19c 100644 --- a/src/version.c +++ b/src/version.c @@ -795,6 +795,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 351, +/**/ 350, /**/ 349, |