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, "\<Esc>")
+ 
+   " Select three lines at the cursor using previous pattern.
+   call term_sendkeys(buf, "/foo\<CR>")
+   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, "\<BS>")
+   sleep 100m
+   call VerifyScreenDump(buf, 'Test_incsearch_substitute_03', {})
  
    call term_sendkeys(buf, "\<Esc>")
    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 -- [email protected] -- 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    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui