0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 8.1.0351: 'incsearch' for :/foo/s//<Esc> changes last search pattern

Problem:    'incsearch' for :/foo/s//<Esc> changes last search pattern.
Solution:   Save the last search pattern earlier.
This commit is contained in:
Bram Moolenaar
2018-09-06 21:44:17 +02:00
parent 0b1468884a
commit 198cb66d65
4 changed files with 43 additions and 3 deletions

View File

@@ -2911,6 +2911,7 @@ free_cmdmod(void)
/* /*
* Parse the address range, if any, in "eap". * Parse the address range, if any, in "eap".
* May set the last search pattern.
* Return FAIL and set "errormsg" or return OK. * Return FAIL and set "errormsg" or return OK.
*/ */
int 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 the next character after the part that was interpreted.
* Set ptr to NULL when an error is encountered. * 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. * Return MAXLNUM when no Ex address was found.
*/ */

View File

@@ -271,6 +271,7 @@ set_search_match(pos_T *t)
/* /*
* Return TRUE when 'incsearch' highlighting is to be done. * Return TRUE when 'incsearch' highlighting is to be done.
* Sets search_first_line and search_last_line to the address range. * Sets search_first_line and search_last_line to the address range.
* May change the last search pattern.
*/ */
static int static int
do_incsearch_highlighting(int firstc, incsearch_state_T *is_state, do_incsearch_highlighting(int firstc, incsearch_state_T *is_state,
@@ -470,8 +471,12 @@ may_do_incsearch_highlighting(
int next_char; int next_char;
int use_last_pat; 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)) if (!do_incsearch_highlighting(firstc, is_state, &skiplen, &patlen))
{ {
restore_last_search_pattern();
finish_incsearch_highlighting(FALSE, is_state, TRUE); finish_incsearch_highlighting(FALSE, is_state, TRUE);
return; return;
} }
@@ -479,6 +484,7 @@ may_do_incsearch_highlighting(
// If there is a character waiting, search and redraw later. // If there is a character waiting, search and redraw later.
if (char_avail()) if (char_avail())
{ {
restore_last_search_pattern();
is_state->incsearch_postponed = TRUE; is_state->incsearch_postponed = TRUE;
return; return;
} }
@@ -493,7 +499,6 @@ may_do_incsearch_highlighting(
curwin->w_cursor.lnum = search_first_line; curwin->w_cursor.lnum = search_first_line;
curwin->w_cursor.col = 0; curwin->w_cursor.col = 0;
} }
save_last_search_pattern();
// Use the previous pattern for ":s//". // Use the previous pattern for ":s//".
next_char = ccline.cmdbuff[skiplen + patlen]; next_char = ccline.cmdbuff[skiplen + patlen];
@@ -627,10 +632,19 @@ may_adjust_incsearch_highlighting(
int i; int i;
int save; int save;
// Parsing range may already set the last search pattern.
save_last_search_pattern();
if (!do_incsearch_highlighting(firstc, is_state, &skiplen, &patlen)) if (!do_incsearch_highlighting(firstc, is_state, &skiplen, &patlen))
{
restore_last_search_pattern();
return OK; return OK;
}
if (patlen == 0 && ccline.cmdbuff[skiplen] == NUL) if (patlen == 0 && ccline.cmdbuff[skiplen] == NUL)
{
restore_last_search_pattern();
return FAIL; return FAIL;
}
if (firstc == ccline.cmdbuff[skiplen]) if (firstc == ccline.cmdbuff[skiplen])
{ {
@@ -641,7 +655,6 @@ may_adjust_incsearch_highlighting(
else else
pat = ccline.cmdbuff + skiplen; pat = ccline.cmdbuff + skiplen;
save_last_search_pattern();
cursor_off(); cursor_off();
out_flush(); out_flush();
if (c == Ctrl_G) 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; 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)) if (!do_incsearch_highlighting(firstc, is_state, &skiplen, &patlen))
{
restore_last_search_pattern();
return FAIL; return FAIL;
}
// Add a character from under the cursor for 'incsearch'. // Add a character from under the cursor for 'incsearch'.
if (is_state->did_incsearch) if (is_state->did_incsearch)

View File

@@ -1043,6 +1043,23 @@ func Test_incsearch_vimgrep_dump()
call delete('Xis_vimgrep_script') call delete('Xis_vimgrep_script')
endfunc 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() func Test_search_undefined_behaviour()
if !has("terminal") if !has("terminal")
return return

View File

@@ -794,6 +794,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
351,
/**/ /**/
350, 350,
/**/ /**/