To: vim_dev@googlegroups.com Subject: Patch 8.1.0277 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.0277 Problem: 'incsearch' highlighting wrong in a few cases. Solution: Fix using last search pattern. Restore highlighting when changing command. (issue #3321) Files: src/ex_getln.c, src/testdir/test_search.vim, src/testdir/dumps/Test_incsearch_substitute_02.dump, src/testdir/dumps/Test_incsearch_substitute_03.dump *** ../vim-8.1.0276/src/ex_getln.c 2018-08-12 15:49:33.551438415 +0200 --- src/ex_getln.c 2018-08-12 17:27:32.113306665 +0200 *************** *** 300,306 **** { delim = *p++; end = skip_regexp(p, delim, p_magic, NULL); ! if (end > p) { char_u *dummy; exarg_T ea; --- 300,306 ---- { delim = *p++; end = skip_regexp(p, delim, p_magic, NULL); ! if (end > p || *end == delim) { char_u *dummy; exarg_T ea; *************** *** 341,346 **** --- 341,377 ---- return FALSE; } + static void + finish_incsearch_highlighting( + int gotesc, + incsearch_state_T *is_state, + int call_update_screen) + { + if (is_state->did_incsearch) + { + is_state->did_incsearch = FALSE; + if (gotesc) + curwin->w_cursor = is_state->save_cursor; + else + { + if (!EQUAL_POS(is_state->save_cursor, is_state->search_start)) + { + // put the '" mark at the original position + curwin->w_cursor = is_state->save_cursor; + setpcmark(); + } + curwin->w_cursor = is_state->search_start; + } + restore_viewstate(&is_state->old_viewstate); + highlight_match = FALSE; + validate_cursor(); /* needed for TAB */ + if (call_update_screen) + update_screen(SOME_VALID); + else + redraw_all_later(SOME_VALID); + } + } + /* * Do 'incsearch' highlighting if desired. */ *************** *** 357,366 **** #ifdef FEAT_RELTIME proftime_T tm; #endif ! int c; if (!do_incsearch_highlighting(firstc, is_state, &skiplen, &patlen)) return; // If there is a character waiting, search and redraw later. if (char_avail()) --- 388,401 ---- #ifdef FEAT_RELTIME proftime_T tm; #endif ! int next_char; ! int use_last_pat; if (!do_incsearch_highlighting(firstc, is_state, &skiplen, &patlen)) + { + finish_incsearch_highlighting(FALSE, is_state, TRUE); return; + } // If there is a character waiting, search and redraw later. if (char_avail()) *************** *** 381,388 **** } save_last_search_pattern(); ! // If there is no command line, don't do anything. ! if (patlen == 0) { i = 0; set_no_hlsearch(TRUE); // turn off previous highlight --- 416,428 ---- } save_last_search_pattern(); ! // Use the previous pattern for ":s//". ! next_char = ccline.cmdbuff[skiplen + patlen]; ! use_last_pat = patlen == 0 && skiplen > 0 ! && ccline.cmdbuff[skiplen - 1] == next_char; ! ! // 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 *************** *** 403,409 **** search_flags += SEARCH_KEEP; if (search_first_line != 0) search_flags += SEARCH_START; - c = ccline.cmdbuff[skiplen + patlen]; ccline.cmdbuff[skiplen + patlen] = NUL; i = do_search(NULL, firstc == ':' ? '/' : firstc, ccline.cmdbuff + skiplen, count, search_flags, --- 443,448 ---- *************** *** 413,419 **** NULL, NULL #endif ); ! ccline.cmdbuff[skiplen + patlen] = c; --emsg_off; if (curwin->w_cursor.lnum < search_first_line --- 452,458 ---- NULL, NULL #endif ); ! ccline.cmdbuff[skiplen + patlen] = next_char; --emsg_off; if (curwin->w_cursor.lnum < search_first_line *************** *** 459,469 **** // Disable 'hlsearch' highlighting if the pattern matches everything. // Avoids a flash when typing "foo\|". ! c = ccline.cmdbuff[skiplen + patlen]; ! ccline.cmdbuff[skiplen + patlen] = NUL; ! if (empty_pattern(ccline.cmdbuff)) ! set_no_hlsearch(TRUE); ! ccline.cmdbuff[skiplen + patlen] = c; validate_cursor(); // May redraw the status line to show the cursor position. --- 498,511 ---- // Disable 'hlsearch' highlighting if the pattern matches everything. // Avoids a flash when typing "foo\|". ! if (!use_last_pat) ! { ! next_char = ccline.cmdbuff[skiplen + patlen]; ! ccline.cmdbuff[skiplen + patlen] = NUL; ! if (empty_pattern(ccline.cmdbuff)) ! set_no_hlsearch(TRUE); ! ccline.cmdbuff[skiplen + patlen] = next_char; ! } validate_cursor(); // May redraw the status line to show the cursor position. *************** *** 628,657 **** } return OK; } - - static void - finish_incsearch_highlighting(int gotesc, incsearch_state_T *is_state) - { - if (is_state->did_incsearch) - { - if (gotesc) - curwin->w_cursor = is_state->save_cursor; - else - { - if (!EQUAL_POS(is_state->save_cursor, is_state->search_start)) - { - // put the '" mark at the original position - curwin->w_cursor = is_state->save_cursor; - setpcmark(); - } - curwin->w_cursor = is_state->search_start; - } - restore_viewstate(&is_state->old_viewstate); - highlight_match = FALSE; - validate_cursor(); /* needed for TAB */ - redraw_all_later(SOME_VALID); - } - } #endif /* --- 670,675 ---- *************** *** 2301,2307 **** ccline.xpc = NULL; #ifdef FEAT_SEARCH_EXTRA ! finish_incsearch_highlighting(gotesc, &is_state); #endif if (ccline.cmdbuff != NULL) --- 2319,2325 ---- ccline.xpc = NULL; #ifdef FEAT_SEARCH_EXTRA ! finish_incsearch_highlighting(gotesc, &is_state, FALSE); #endif if (ccline.cmdbuff != NULL) *** ../vim-8.1.0276/src/testdir/test_search.vim 2018-08-12 16:26:43.427713531 +0200 --- src/testdir/test_search.vim 2018-08-12 17:33:19.978924077 +0200 *************** *** 839,844 **** --- 839,845 ---- sleep 100m " Need to send one key at a time to force a redraw. + " Select three lines at the cursor with typed pattern. call term_sendkeys(buf, ':.,.+2s/') sleep 100m call term_sendkeys(buf, 'f') *************** *** 846,852 **** --- 847,867 ---- call term_sendkeys(buf, 'o') sleep 100m call term_sendkeys(buf, 'o') + sleep 100m call VerifyScreenDump(buf, 'Test_incsearch_substitute_01', {}) + call term_sendkeys(buf, "\") + + " Select three lines at the cursor using previous pattern. + call term_sendkeys(buf, "/foo\") + sleep 100m + call term_sendkeys(buf, ':.,.+2s//') + sleep 100m + call VerifyScreenDump(buf, 'Test_incsearch_substitute_02', {}) + + " Deleting last slash should remove the match. + call term_sendkeys(buf, "\") + sleep 100m + call VerifyScreenDump(buf, 'Test_incsearch_substitute_03', {}) call term_sendkeys(buf, "\") call StopVimInTerminal(buf) *** ../vim-8.1.0276/src/testdir/dumps/Test_incsearch_substitute_02.dump 2018-08-12 17:37:49.457116653 +0200 --- src/testdir/dumps/Test_incsearch_substitute_02.dump 2018-08-12 17:02:58.756857477 +0200 *************** *** 0 **** --- 1,9 ---- + |f+0&#ffffff0|o@1| |1| @64 + |f|o@1| |2| @64 + |f|o@1| |3| @64 + |f+1&&|o@1| +0&&|4| @64 + |f+0&#ffff4012|o@1| +0&#ffffff0|5| @64 + |f+0&#ffff4012|o@1| +0&#ffffff0|6| @64 + |f|o@1| |7| @64 + |f|o@1| |8| @64 + |:|.|,|.|+|2|s|/@1> @60 *** ../vim-8.1.0276/src/testdir/dumps/Test_incsearch_substitute_03.dump 2018-08-12 17:37:49.465116598 +0200 --- src/testdir/dumps/Test_incsearch_substitute_03.dump 2018-08-12 17:33:35.062824462 +0200 *************** *** 0 **** --- 1,9 ---- + |f+0&#ffff4012|o@1| +0&#ffffff0|1| @64 + |f+0&#ffff4012|o@1| +0&#ffffff0|2| @64 + |f+0&#ffff4012|o@1| +0&#ffffff0|3| @64 + |f+0&#ffff4012|o@1| +0&#ffffff0|4| @64 + |f+0&#ffff4012|o@1| +0&#ffffff0|5| @64 + |f+0&#ffff4012|o@1| +0&#ffffff0|6| @64 + |f+0&#ffff4012|o@1| +0&#ffffff0|7| @64 + |f+0&#ffff4012|o@1| +0&#ffffff0|8| @64 + |:|.|,|.|+|2|s|/> @61 *** ../vim-8.1.0276/src/version.c 2018-08-12 16:26:43.427713531 +0200 --- src/version.c 2018-08-12 16:57:04.292430111 +0200 *************** *** 796,797 **** --- 796,799 ---- { /* Add new patch number below this line */ + /**/ + 277, /**/ -- Citizens are not allowed to attend a movie house or theater nor ride in a public streetcar within at least four hours after eating garlic. [real standing law in Indiana, United States of America] /// 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 ///