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.
diff --git a/src/ex_getln.c b/src/ex_getln.c
index c316e19..80f210a 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -271,6 +271,7 @@
/*
* 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 @@
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 @@
// 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 @@
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 @@
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 @@
else
pat = ccline.cmdbuff + skiplen;
- save_last_search_pattern();
cursor_off();
out_flush();
if (c == Ctrl_G)
@@ -721,8 +734,14 @@
{
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)