diff --git a/src/ex_getln.c b/src/ex_getln.c index 52eda33c73..e6bb815b45 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -745,39 +745,35 @@ may_add_char_to_search(int firstc, int *c, incsearch_state_T *is_state) if (is_state->did_incsearch) { curwin->w_cursor = is_state->match_end; - if (!EQUAL_POS(curwin->w_cursor, is_state->search_start)) + *c = gchar_cursor(); + if (*c != NUL) { - *c = gchar_cursor(); - // If 'ignorecase' and 'smartcase' are set and the // command line has no uppercase characters, convert // the character to lowercase. if (p_ic && p_scs && !pat_has_uppercase(ccline.cmdbuff + skiplen)) *c = MB_TOLOWER(*c); - if (*c != NUL) + if (*c == firstc || vim_strchr((char_u *)( + p_magic ? "\\~^$.*[" : "\\^$"), *c) != NULL) { - if (*c == firstc || vim_strchr((char_u *)( - p_magic ? "\\~^$.*[" : "\\^$"), *c) != NULL) - { - // put a backslash before special characters - stuffcharReadbuff(*c); - *c = '\\'; - } - // add any composing characters - if (mb_char2len(*c) != mb_ptr2len(ml_get_cursor())) - { - int save_c = *c; - - while (mb_char2len(*c) != mb_ptr2len(ml_get_cursor())) - { - curwin->w_cursor.col += mb_char2len(*c); - *c = gchar_cursor(); - stuffcharReadbuff(*c); - } - *c = save_c; - } - return FAIL; + // put a backslash before special characters + stuffcharReadbuff(*c); + *c = '\\'; } + // add any composing characters + if (mb_char2len(*c) != mb_ptr2len(ml_get_cursor())) + { + int save_c = *c; + + while (mb_char2len(*c) != mb_ptr2len(ml_get_cursor())) + { + curwin->w_cursor.col += mb_char2len(*c); + *c = gchar_cursor(); + stuffcharReadbuff(*c); + } + *c = save_c; + } + return FAIL; } } return OK; diff --git a/src/testdir/test_search.vim b/src/testdir/test_search.vim index d32369d5a2..525d0d200d 100644 --- a/src/testdir/test_search.vim +++ b/src/testdir/test_search.vim @@ -1248,3 +1248,20 @@ func Test_one_error_msg() " This was also giving an internal error call assert_fails('call search(" \\((\\v[[=P=]]){185}+ ")', 'E871:') endfunc + +func Test_incsearch_add_char_under_cursor() + if !exists('+incsearch') + return + endif + set incsearch + new + call setline(1, ['find match', 'anything']) + 1 + call test_override('char_avail', 1) + call feedkeys("fc/m\\\\\\", 'tx') + call assert_equal('match', @/) + call test_override('char_avail', 0) + + set incsearch& + bwipe! +endfunc diff --git a/src/version.c b/src/version.c index 4755317795..3da2d7a097 100644 --- a/src/version.c +++ b/src/version.c @@ -771,6 +771,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1148, /**/ 1147, /**/