0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

patch 8.1.0356: using :s with 'incsearch' prevents CTRL-R CTRL-W

Problem:    Using :s with 'incsearch' prevents CTRL-R CTRL-W. (Boris Staletic)
Solution:   When past the pattern put cursor back in the start position.
            (closes #3413)
This commit is contained in:
Bram Moolenaar
2018-09-09 15:54:14 +02:00
parent a750ac2288
commit 99f043a57d
3 changed files with 50 additions and 9 deletions

View File

@@ -462,7 +462,7 @@ may_do_incsearch_highlighting(
incsearch_state_T *is_state) incsearch_state_T *is_state)
{ {
int skiplen, patlen; int skiplen, patlen;
int i; int found; // do_search() result
pos_T end_pos; pos_T end_pos;
struct cmdline_info save_ccline; struct cmdline_info save_ccline;
#ifdef FEAT_RELTIME #ifdef FEAT_RELTIME
@@ -508,7 +508,7 @@ may_do_incsearch_highlighting(
// If there is no pattern, don't do anything. // If there is no pattern, don't do anything.
if (patlen == 0 && !use_last_pat) if (patlen == 0 && !use_last_pat)
{ {
i = 0; found = 0;
set_no_hlsearch(TRUE); // turn off previous highlight set_no_hlsearch(TRUE); // turn off previous highlight
redraw_all_later(SOME_VALID); redraw_all_later(SOME_VALID);
} }
@@ -528,7 +528,7 @@ may_do_incsearch_highlighting(
if (search_first_line != 0) if (search_first_line != 0)
search_flags += SEARCH_START; search_flags += SEARCH_START;
ccline.cmdbuff[skiplen + patlen] = NUL; ccline.cmdbuff[skiplen + patlen] = NUL;
i = do_search(NULL, firstc == ':' ? '/' : firstc, found = do_search(NULL, firstc == ':' ? '/' : firstc,
ccline.cmdbuff + skiplen, count, search_flags, ccline.cmdbuff + skiplen, count, search_flags,
#ifdef FEAT_RELTIME #ifdef FEAT_RELTIME
&tm, NULL &tm, NULL
@@ -543,7 +543,7 @@ may_do_incsearch_highlighting(
|| curwin->w_cursor.lnum > search_last_line) || curwin->w_cursor.lnum > search_last_line)
{ {
// match outside of address range // match outside of address range
i = 0; found = 0;
curwin->w_cursor = is_state->search_start; curwin->w_cursor = is_state->search_start;
} }
@@ -552,13 +552,13 @@ may_do_incsearch_highlighting(
{ {
(void)vpeekc(); // remove <C-C> from input stream (void)vpeekc(); // remove <C-C> from input stream
got_int = FALSE; // don't abandon the command line got_int = FALSE; // don't abandon the command line
i = 0; found = 0;
} }
else if (char_avail()) else if (char_avail())
// cancelled searching because a char was typed // cancelled searching because a char was typed
is_state->incsearch_postponed = TRUE; is_state->incsearch_postponed = TRUE;
} }
if (i != 0) if (found != 0)
highlight_match = TRUE; // highlight position highlight_match = TRUE; // highlight position
else else
highlight_match = FALSE; // remove highlight highlight_match = FALSE; // remove highlight
@@ -569,7 +569,7 @@ may_do_incsearch_highlighting(
changed_cline_bef_curs(); changed_cline_bef_curs();
update_topline(); update_topline();
if (i != 0) if (found != 0)
{ {
pos_T save_pos = curwin->w_cursor; pos_T save_pos = curwin->w_cursor;
@@ -604,8 +604,11 @@ may_do_incsearch_highlighting(
restore_cmdline(&save_ccline); restore_cmdline(&save_ccline);
restore_last_search_pattern(); restore_last_search_pattern();
// Leave it at the end to make CTRL-R CTRL-W work. // Leave it at the end to make CTRL-R CTRL-W work. But not when beyond the
if (i != 0) // end of the pattern, e.g. for ":s/pat/".
if (ccline.cmdbuff[skiplen + patlen] != NUL)
curwin->w_cursor = is_state->search_start;
else if (found != 0)
curwin->w_cursor = end_pos; curwin->w_cursor = end_pos;
msg_starthere(); msg_starthere();

View File

@@ -1060,6 +1060,42 @@ func Test_keep_last_search_pattern()
set noincsearch set noincsearch
endfunc endfunc
func Test_word_under_cursor_after_match()
if !exists('+incsearch')
return
endif
new
call setline(1, 'foo bar')
set incsearch
call test_override("char_avail", 1)
try
call feedkeys("/foo\<C-R>\<C-W>\<CR>", 'ntx')
catch /E486:/
endtry
call assert_equal('foobar', @/)
bwipe!
call test_override("ALL", 0)
set noincsearch
endfunc
func Test_subst_word_under_cursor()
if !exists('+incsearch')
return
endif
new
call setline(1, ['int SomeLongName;', 'for (xxx = 1; xxx < len; ++xxx)'])
set incsearch
call test_override("char_avail", 1)
call feedkeys("/LongName\<CR>", 'ntx')
call feedkeys(":%s/xxx/\<C-R>\<C-W>/g\<CR>", 'ntx')
call assert_equal('for (SomeLongName = 1; SomeLongName < len; ++SomeLongName)', getline(2))
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 */
/**/
356,
/**/ /**/
355, 355,
/**/ /**/