mirror of
https://github.com/vim/vim.git
synced 2025-09-27 04:14:06 -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:
@@ -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();
|
||||||
|
@@ -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
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user