To: vim_dev@googlegroups.com Subject: Patch 8.1.0351 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.0351 Problem: 'incsearch' for :/foo/s// changes last search pattern. Solution: Save the last search pattern earlier. Files: src/ex_docmd.c, src/ex_getln.c, src/testdir/test_search.vim *** ../vim-8.1.0350/src/ex_docmd.c 2018-08-30 15:58:23.244944556 +0200 --- src/ex_docmd.c 2018-09-06 21:39:52.646486318 +0200 *************** *** 2911,2916 **** --- 2911,2917 ---- /* * Parse the address range, if any, in "eap". + * May set the last search pattern. * Return FAIL and set "errormsg" or return OK. */ int *************** *** 4436,4445 **** } /* ! * get a single EX address * * Set ptr to the next character after the part that was interpreted. * Set ptr to NULL when an error is encountered. * * Return MAXLNUM when no Ex address was found. */ --- 4437,4447 ---- } /* ! * Get a single EX address. * * Set ptr to the next character after the part that was interpreted. * Set ptr to NULL when an error is encountered. + * This may set the last used search pattern. * * Return MAXLNUM when no Ex address was found. */ *** ../vim-8.1.0350/src/ex_getln.c 2018-08-31 22:09:31.561549259 +0200 --- src/ex_getln.c 2018-09-06 21:39:30.638725276 +0200 *************** *** 271,276 **** --- 271,277 ---- /* * 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,477 **** --- 471,482 ---- 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,484 **** --- 484,490 ---- // If there is a character waiting, search and redraw later. if (char_avail()) { + restore_last_search_pattern(); is_state->incsearch_postponed = TRUE; return; } *************** *** 493,499 **** 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]; --- 499,504 ---- *************** *** 627,636 **** --- 632,650 ---- 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,647 **** else pat = ccline.cmdbuff + skiplen; - save_last_search_pattern(); cursor_off(); out_flush(); if (c == Ctrl_G) --- 655,660 ---- *************** *** 721,728 **** --- 734,747 ---- { 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) *** ../vim-8.1.0350/src/testdir/test_search.vim 2018-08-31 22:09:31.561549259 +0200 --- src/testdir/test_search.vim 2018-09-06 21:36:42.844553891 +0200 *************** *** 1043,1048 **** --- 1043,1065 ---- call delete('Xis_vimgrep_script') endfunc + func Test_keep_last_search_pattern() + if !exists('+incsearch') + return + endif + new + call setline(1, ['foo', 'foo', 'foo']) + set incsearch + call test_override("char_avail", 1) + let @/ = 'bar' + call feedkeys(":/foo/s//\", 'ntx') + call assert_equal('bar', @/) + + bwipe! + call test_override("ALL", 0) + set noincsearch + endfunc + func Test_search_undefined_behaviour() if !has("terminal") return *** ../vim-8.1.0350/src/version.c 2018-09-06 16:27:20.664831945 +0200 --- src/version.c 2018-09-06 21:33:45.218506207 +0200 *************** *** 796,797 **** --- 796,799 ---- { /* Add new patch number below this line */ + /**/ + 351, /**/ -- How To Keep A Healthy Level Of Insanity: 3. Every time someone asks you to do something, ask if they want fries with that. /// 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 ///