To: vim_dev@googlegroups.com Subject: Patch 8.1.0356 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.0356 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) Files: src/ex_getln.c, src/testdir/test_search.vim *** ../vim-8.1.0355/src/ex_getln.c 2018-09-06 21:44:13.660006996 +0200 --- src/ex_getln.c 2018-09-09 15:53:37.117142011 +0200 *************** *** 462,468 **** incsearch_state_T *is_state) { int skiplen, patlen; ! int i; pos_T end_pos; struct cmdline_info save_ccline; #ifdef FEAT_RELTIME --- 462,468 ---- incsearch_state_T *is_state) { int skiplen, patlen; ! int found; // do_search() result pos_T end_pos; struct cmdline_info save_ccline; #ifdef FEAT_RELTIME *************** *** 508,514 **** // If there is no pattern, don't do anything. if (patlen == 0 && !use_last_pat) { ! i = 0; set_no_hlsearch(TRUE); // turn off previous highlight redraw_all_later(SOME_VALID); } --- 508,514 ---- // If there is no pattern, don't do anything. if (patlen == 0 && !use_last_pat) { ! found = 0; set_no_hlsearch(TRUE); // turn off previous highlight redraw_all_later(SOME_VALID); } *************** *** 528,534 **** if (search_first_line != 0) search_flags += SEARCH_START; ccline.cmdbuff[skiplen + patlen] = NUL; ! i = do_search(NULL, firstc == ':' ? '/' : firstc, ccline.cmdbuff + skiplen, count, search_flags, #ifdef FEAT_RELTIME &tm, NULL --- 528,534 ---- if (search_first_line != 0) search_flags += SEARCH_START; ccline.cmdbuff[skiplen + patlen] = NUL; ! found = do_search(NULL, firstc == ':' ? '/' : firstc, ccline.cmdbuff + skiplen, count, search_flags, #ifdef FEAT_RELTIME &tm, NULL *************** *** 543,549 **** || curwin->w_cursor.lnum > search_last_line) { // match outside of address range ! i = 0; curwin->w_cursor = is_state->search_start; } --- 543,549 ---- || curwin->w_cursor.lnum > search_last_line) { // match outside of address range ! found = 0; curwin->w_cursor = is_state->search_start; } *************** *** 552,564 **** { (void)vpeekc(); // remove from input stream got_int = FALSE; // don't abandon the command line ! i = 0; } else if (char_avail()) // cancelled searching because a char was typed is_state->incsearch_postponed = TRUE; } ! if (i != 0) highlight_match = TRUE; // highlight position else highlight_match = FALSE; // remove highlight --- 552,564 ---- { (void)vpeekc(); // remove from input stream got_int = FALSE; // don't abandon the command line ! found = 0; } else if (char_avail()) // cancelled searching because a char was typed is_state->incsearch_postponed = TRUE; } ! if (found != 0) highlight_match = TRUE; // highlight position else highlight_match = FALSE; // remove highlight *************** *** 569,575 **** changed_cline_bef_curs(); update_topline(); ! if (i != 0) { pos_T save_pos = curwin->w_cursor; --- 569,575 ---- changed_cline_bef_curs(); update_topline(); ! if (found != 0) { pos_T save_pos = curwin->w_cursor; *************** *** 604,611 **** restore_cmdline(&save_ccline); restore_last_search_pattern(); ! // Leave it at the end to make CTRL-R CTRL-W work. ! if (i != 0) curwin->w_cursor = end_pos; msg_starthere(); --- 604,614 ---- restore_cmdline(&save_ccline); restore_last_search_pattern(); ! // Leave it at the end to make CTRL-R CTRL-W work. But not when beyond the ! // 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; msg_starthere(); *** ../vim-8.1.0355/src/testdir/test_search.vim 2018-09-06 21:44:13.660006996 +0200 --- src/testdir/test_search.vim 2018-09-09 15:50:31.934618534 +0200 *************** *** 1060,1065 **** --- 1060,1101 ---- set noincsearch 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\\\", '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\", 'ntx') + call feedkeys(":%s/xxx/\\/g\", '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() if !has("terminal") return *** ../vim-8.1.0355/src/version.c 2018-09-09 15:27:54.812344748 +0200 --- src/version.c 2018-09-09 15:52:51.437517050 +0200 *************** *** 796,797 **** --- 796,799 ---- { /* Add new patch number below this line */ + /**/ + 356, /**/ -- "So this is it," said Arthur, "we are going to die." "Yes," said Ford, "except...no! Wait a minute!" He suddenly lunged across the chamber at something behind Arthur's line of vision. "What's this switch?" he cried. "What? Where?" cried Arthur, twisting around. "No, I was only fooling," said Ford, "we are going to die after all." -- Douglas Adams, "The Hitchhiker's Guide to the Galaxy" /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///