Patch 8.2.0295
Problem:    Highlighting for :s wrong when using different separator.
Solution:   Use separat argument for search direction and separator. (Rob
            Pilling, closes #5665)
Files:      src/ex_docmd.c, src/ex_getln.c, src/gui.c, src/normal.c,
            src/proto/search.pro, src/quickfix.c, src/search.c, src/spell.c,
            src/tag.c, src/testdir/dumps/Test_incsearch_substitute_15.dump,
            src/testdir/test_search.vim


*** ../vim-8.2.0294/src/ex_docmd.c      2020-02-18 21:32:55.850340488 +0100
--- src/ex_docmd.c      2020-02-21 21:18:43.930882073 +0100
***************
*** 3671,3677 ****
                        curwin->w_cursor.col = 0;
                    searchcmdlen = 0;
                    flags = silent ? 0 : SEARCH_HIS | SEARCH_MSG;
!                   if (!do_search(NULL, c, cmd, 1L, flags, NULL))
                    {
                        curwin->w_cursor = pos;
                        cmd = NULL;
--- 3671,3677 ----
                        curwin->w_cursor.col = 0;
                    searchcmdlen = 0;
                    flags = silent ? 0 : SEARCH_HIS | SEARCH_MSG;
!                   if (!do_search(NULL, c, c, cmd, 1L, flags, NULL))
                    {
                        curwin->w_cursor = pos;
                        cmd = NULL;
*** ../vim-8.2.0294/src/ex_getln.c      2019-12-14 16:18:11.578458401 +0100
--- src/ex_getln.c      2020-02-21 21:18:43.930882073 +0100
***************
*** 184,190 ****
   * May change the last search pattern.
   */
      static int
! do_incsearch_highlighting(int firstc, incsearch_state_T *is_state,
                                                     int *skiplen, int *patlen)
  {
      char_u    *cmd;
--- 184,190 ----
   * May change the last search pattern.
   */
      static int
! do_incsearch_highlighting(int firstc, int *search_delim, incsearch_state_T 
*is_state,
                                                     int *skiplen, int *patlen)
  {
      char_u    *cmd;
***************
*** 210,216 ****
--- 210,219 ----
      search_last_line = MAXLNUM;
  
      if (firstc == '/' || firstc == '?')
+     {
+       *search_delim = firstc;
        return TRUE;
+     }
      if (firstc != ':')
        return FALSE;
  
***************
*** 273,278 ****
--- 276,282 ----
  
      p = skipwhite(p);
      delim = (delim_optional && vim_isIDc(*p)) ? ' ' : *p++;
+     *search_delim = delim;
      end = skip_regexp(p, delim, p_magic, NULL);
  
      use_last_pat = end == p && *end == delim;
***************
*** 385,396 ****
      int               next_char;
      int               use_last_pat;
      int               did_do_incsearch = is_state->did_incsearch;
  
      // Parsing range may already set the last search pattern.
      // NOTE: must call restore_last_search_pattern() before returning!
      save_last_search_pattern();
  
!     if (!do_incsearch_highlighting(firstc, is_state, &skiplen, &patlen))
      {
        restore_last_search_pattern();
        finish_incsearch_highlighting(FALSE, is_state, TRUE);
--- 389,401 ----
      int               next_char;
      int               use_last_pat;
      int               did_do_incsearch = is_state->did_incsearch;
+     int               search_delim;
  
      // Parsing range may already set the last search pattern.
      // NOTE: must call restore_last_search_pattern() before returning!
      save_last_search_pattern();
  
!     if (!do_incsearch_highlighting(firstc, &search_delim, is_state, &skiplen, 
&patlen))
      {
        restore_last_search_pattern();
        finish_incsearch_highlighting(FALSE, is_state, TRUE);
***************
*** 457,463 ****
        vim_memset(&sia, 0, sizeof(sia));
        sia.sa_tm = &tm;
  #endif
!       found = do_search(NULL, firstc == ':' ? '/' : firstc,
                                 ccline.cmdbuff + skiplen, count, search_flags,
  #ifdef FEAT_RELTIME
                &sia
--- 462,468 ----
        vim_memset(&sia, 0, sizeof(sia));
        sia.sa_tm = &tm;
  #endif
!       found = do_search(NULL, firstc == ':' ? '/' : firstc, search_delim,
                                 ccline.cmdbuff + skiplen, count, search_flags,
  #ifdef FEAT_RELTIME
                &sia
***************
*** 565,576 ****
      int           search_flags = SEARCH_NOOF;
      int           i;
      int           save;
  
      // Parsing range may already set the last search pattern.
      // NOTE: must call restore_last_search_pattern() before returning!
      save_last_search_pattern();
  
!     if (!do_incsearch_highlighting(firstc, is_state, &skiplen, &patlen))
      {
        restore_last_search_pattern();
        return OK;
--- 570,582 ----
      int           search_flags = SEARCH_NOOF;
      int           i;
      int           save;
+     int           search_delim;
  
      // Parsing range may already set the last search pattern.
      // NOTE: must call restore_last_search_pattern() before returning!
      save_last_search_pattern();
  
!     if (!do_incsearch_highlighting(firstc, &search_delim, is_state, &skiplen, 
&patlen))
      {
        restore_last_search_pattern();
        return OK;
***************
*** 581,587 ****
        return FAIL;
      }
  
!     if (firstc == ccline.cmdbuff[skiplen])
      {
        pat = last_search_pattern();
        skiplen = 0;
--- 587,593 ----
        return FAIL;
      }
  
!     if (search_delim == ccline.cmdbuff[skiplen])
      {
        pat = last_search_pattern();
        skiplen = 0;
***************
*** 668,680 ****
      static int
  may_add_char_to_search(int firstc, int *c, incsearch_state_T *is_state)
  {
!     int               skiplen, patlen;
  
      // Parsing range may already set the last search pattern.
      // NOTE: must call restore_last_search_pattern() before returning!
      save_last_search_pattern();
  
!     if (!do_incsearch_highlighting(firstc, is_state, &skiplen, &patlen))
      {
        restore_last_search_pattern();
        return FAIL;
--- 674,686 ----
      static int
  may_add_char_to_search(int firstc, int *c, incsearch_state_T *is_state)
  {
!     int               skiplen, patlen, search_delim;
  
      // Parsing range may already set the last search pattern.
      // NOTE: must call restore_last_search_pattern() before returning!
      save_last_search_pattern();
  
!     if (!do_incsearch_highlighting(firstc, &search_delim, is_state, &skiplen, 
&patlen))
      {
        restore_last_search_pattern();
        return FAIL;
***************
*** 693,699 ****
            // the character to lowercase.
            if (p_ic && p_scs && !pat_has_uppercase(ccline.cmdbuff + skiplen))
                *c = MB_TOLOWER(*c);
!           if (*c == firstc || vim_strchr((char_u *)(
                               p_magic ? "\\~^$.*[" : "\\^$"), *c) != NULL)
            {
                // put a backslash before special characters
--- 699,705 ----
            // the character to lowercase.
            if (p_ic && p_scs && !pat_has_uppercase(ccline.cmdbuff + skiplen))
                *c = MB_TOLOWER(*c);
!           if (*c == search_delim || vim_strchr((char_u *)(
                               p_magic ? "\\~^$.*[" : "\\^$"), *c) != NULL)
            {
                // put a backslash before special characters
*** ../vim-8.2.0294/src/gui.c   2020-01-26 21:59:25.624718145 +0100
--- src/gui.c   2020-02-21 21:18:43.930882073 +0100
***************
*** 5374,5380 ****
        i = msg_scroll;
        if (down)
        {
!           (void)do_search(NULL, '/', ga.ga_data, 1L, searchflags, NULL);
        }
        else
        {
--- 5374,5380 ----
        i = msg_scroll;
        if (down)
        {
!           (void)do_search(NULL, '/', '/', ga.ga_data, 1L, searchflags, NULL);
        }
        else
        {
***************
*** 5382,5388 ****
            // direction
            p = vim_strsave_escaped(ga.ga_data, (char_u *)"?");
            if (p != NULL)
!               (void)do_search(NULL, '?', p, 1L, searchflags, NULL);
            vim_free(p);
        }
  
--- 5382,5388 ----
            // direction
            p = vim_strsave_escaped(ga.ga_data, (char_u *)"?");
            if (p != NULL)
!               (void)do_search(NULL, '?', '?', p, 1L, searchflags, NULL);
            vim_free(p);
        }
  
*** ../vim-8.2.0294/src/normal.c        2020-01-26 21:59:25.628718127 +0100
--- src/normal.c        2020-02-21 21:18:43.930882073 +0100
***************
*** 4304,4310 ****
      curwin->w_set_curswant = TRUE;
  
      vim_memset(&sia, 0, sizeof(sia));
!     i = do_search(cap->oap, dir, pat, cap->count1,
                            opt | SEARCH_OPT | SEARCH_ECHO | SEARCH_MSG, &sia);
      if (wrapped != NULL)
        *wrapped = sia.sa_wrapped;
--- 4304,4310 ----
      curwin->w_set_curswant = TRUE;
  
      vim_memset(&sia, 0, sizeof(sia));
!     i = do_search(cap->oap, dir, dir, pat, cap->count1,
                            opt | SEARCH_OPT | SEARCH_ECHO | SEARCH_MSG, &sia);
      if (wrapped != NULL)
        *wrapped = sia.sa_wrapped;
*** ../vim-8.2.0294/src/proto/search.pro        2020-02-12 22:15:14.856205206 
+0100
--- src/proto/search.pro        2020-02-21 21:18:43.934882059 +0100
***************
*** 24,30 ****
  void last_pat_prog(regmmatch_T *regmatch);
  int searchit(win_T *win, buf_T *buf, pos_T *pos, pos_T *end_pos, int dir, 
char_u *pat, long count, int options, int pat_use, searchit_arg_T *extra_arg);
  void set_search_direction(int cdir);
! int do_search(oparg_T *oap, int dirc, char_u *pat, long count, int options, 
searchit_arg_T *sia);
  int search_for_exact_line(buf_T *buf, pos_T *pos, int dir, char_u *pat);
  int searchc(cmdarg_T *cap, int t_cmd);
  pos_T *findmatch(oparg_T *oap, int initc);
--- 24,30 ----
  void last_pat_prog(regmmatch_T *regmatch);
  int searchit(win_T *win, buf_T *buf, pos_T *pos, pos_T *end_pos, int dir, 
char_u *pat, long count, int options, int pat_use, searchit_arg_T *extra_arg);
  void set_search_direction(int cdir);
! int do_search(oparg_T *oap, int dirc, int search_delim, char_u *pat, long 
count, int options, searchit_arg_T *sia);
  int search_for_exact_line(buf_T *buf, pos_T *pos, int dir, char_u *pat);
  int searchc(cmdarg_T *cap, int t_cmd);
  pos_T *findmatch(oparg_T *oap, int initc);
*** ../vim-8.2.0294/src/quickfix.c      2020-02-15 23:06:40.826770264 +0100
--- src/quickfix.c      2020-02-21 21:18:43.934882059 +0100
***************
*** 3197,3203 ****
        // Move the cursor to the first line in the buffer
        save_cursor = curwin->w_cursor;
        curwin->w_cursor.lnum = 0;
!       if (!do_search(NULL, '/', qf_pattern, (long)1, SEARCH_KEEP, NULL))
            curwin->w_cursor = save_cursor;
      }
  }
--- 3197,3203 ----
        // Move the cursor to the first line in the buffer
        save_cursor = curwin->w_cursor;
        curwin->w_cursor.lnum = 0;
!       if (!do_search(NULL, '/', '/', qf_pattern, (long)1, SEARCH_KEEP, NULL))
            curwin->w_cursor = save_cursor;
      }
  }
*** ../vim-8.2.0294/src/search.c        2020-02-12 22:15:14.856205206 +0100
--- src/search.c        2020-02-21 21:18:43.934882059 +0100
***************
*** 1187,1192 ****
--- 1187,1193 ----
  do_search(
      oparg_T       *oap,       // can be NULL
      int                   dirc,       // '/' or '?'
+     int                   search_delim, // the delimiter for the search, e.g. 
'%' in s%regex%replacement%
      char_u        *pat,
      long          count,
      int                   options,
***************
*** 1285,1291 ****
        searchstr = pat;
        dircp = NULL;
                                            // use previous pattern
!       if (pat == NULL || *pat == NUL || *pat == dirc)
        {
            if (spats[RE_SEARCH].pat == NULL)       // no previous pattern
            {
--- 1286,1292 ----
        searchstr = pat;
        dircp = NULL;
                                            // use previous pattern
!       if (pat == NULL || *pat == NUL || *pat == search_delim)
        {
            if (spats[RE_SEARCH].pat == NULL)       // no previous pattern
            {
***************
*** 1311,1317 ****
             * If there is a matching '/' or '?', toss it.
             */
            ps = strcopy;
!           p = skip_regexp(pat, dirc, (int)p_magic, &strcopy);
            if (strcopy != ps)
            {
                // made a copy of "pat" to change "\?" to "?"
--- 1312,1318 ----
             * If there is a matching '/' or '?', toss it.
             */
            ps = strcopy;
!           p = skip_regexp(pat, search_delim, (int)p_magic, &strcopy);
            if (strcopy != ps)
            {
                // made a copy of "pat" to change "\?" to "?"
***************
*** 1319,1325 ****
                pat = strcopy;
                searchstr = strcopy;
            }
!           if (*p == dirc)
            {
                dircp = p;      // remember where we put the NUL
                *p++ = NUL;
--- 1320,1326 ----
                pat = strcopy;
                searchstr = strcopy;
            }
!           if (*p == search_delim)
            {
                dircp = p;      // remember where we put the NUL
                *p++ = NUL;
***************
*** 1525,1531 ****
                RE_LAST, sia);
  
        if (dircp != NULL)
!           *dircp = dirc;      // restore second '/' or '?' for normal_cmd()
  
        if (!shortmess(SHM_SEARCH)
                && ((dirc == '/' && LT_POS(pos, curwin->w_cursor))
--- 1526,1532 ----
                RE_LAST, sia);
  
        if (dircp != NULL)
!           *dircp = search_delim;      // restore second '/' or '?' for 
normal_cmd()
  
        if (!shortmess(SHM_SEARCH)
                && ((dirc == '/' && LT_POS(pos, curwin->w_cursor))
***************
*** 1606,1611 ****
--- 1607,1613 ----
            break;
  
        dirc = *++pat;
+       search_delim = dirc;
        if (dirc != '?' && dirc != '/')
        {
            retval = 0;
*** ../vim-8.2.0294/src/spell.c 2020-01-26 21:59:25.632718110 +0100
--- src/spell.c 2020-02-21 21:18:43.934882059 +0100
***************
*** 2861,2867 ****
      curwin->w_cursor.lnum = 0;
      while (!got_int)
      {
!       if (do_search(NULL, '/', frompat, 1L, SEARCH_KEEP, NULL) == 0
                                                   || u_save_cursor() == FAIL)
            break;
  
--- 2861,2867 ----
      curwin->w_cursor.lnum = 0;
      while (!got_int)
      {
!       if (do_search(NULL, '/', '/', frompat, 1L, SEARCH_KEEP, NULL) == 0
                                                   || u_save_cursor() == FAIL)
            break;
  
*** ../vim-8.2.0294/src/tag.c   2020-01-30 14:55:29.010670407 +0100
--- src/tag.c   2020-02-21 21:18:43.934882059 +0100
***************
*** 3543,3549 ****
            else
                // start search before first line
                curwin->w_cursor.lnum = 0;
!           if (do_search(NULL, pbuf[0], pbuf + 1, (long)1,
                                                         search_options, NULL))
                retval = OK;
            else
--- 3543,3549 ----
            else
                // start search before first line
                curwin->w_cursor.lnum = 0;
!           if (do_search(NULL, pbuf[0], pbuf[0], pbuf + 1, (long)1,
                                                         search_options, NULL))
                retval = OK;
            else
***************
*** 3555,3561 ****
                 * try again, ignore case now
                 */
                p_ic = TRUE;
!               if (!do_search(NULL, pbuf[0], pbuf + 1, (long)1,
                                                         search_options, NULL))
                {
                    /*
--- 3555,3561 ----
                 * try again, ignore case now
                 */
                p_ic = TRUE;
!               if (!do_search(NULL, pbuf[0], pbuf[0], pbuf + 1, (long)1,
                                                         search_options, NULL))
                {
                    /*
***************
*** 3566,3578 ****
                    cc = *tagp.tagname_end;
                    *tagp.tagname_end = NUL;
                    sprintf((char *)pbuf, "^%s\\s\\*(", tagp.tagname);
!                   if (!do_search(NULL, '/', pbuf, (long)1,
                                                         search_options, NULL))
                    {
                        // Guess again: "^char * \<func  ("
                        sprintf((char *)pbuf, "^\\[#a-zA-Z_]\\.\\*\\<%s\\s\\*(",
                                                                tagp.tagname);
!                       if (!do_search(NULL, '/', pbuf, (long)1,
                                                         search_options, NULL))
                            found = 0;
                    }
--- 3566,3578 ----
                    cc = *tagp.tagname_end;
                    *tagp.tagname_end = NUL;
                    sprintf((char *)pbuf, "^%s\\s\\*(", tagp.tagname);
!                   if (!do_search(NULL, '/', '/', pbuf, (long)1,
                                                         search_options, NULL))
                    {
                        // Guess again: "^char * \<func  ("
                        sprintf((char *)pbuf, "^\\[#a-zA-Z_]\\.\\*\\<%s\\s\\*(",
                                                                tagp.tagname);
!                       if (!do_search(NULL, '/', '/', pbuf, (long)1,
                                                         search_options, NULL))
                            found = 0;
                    }
*** ../vim-8.2.0294/src/testdir/dumps/Test_incsearch_substitute_15.dump 
2020-02-21 21:30:24.032020107 +0100
--- src/testdir/dumps/Test_incsearch_substitute_15.dump 2020-02-21 
21:18:43.934882059 +0100
***************
*** 0 ****
--- 1,4 ----
+ |h+0&#ffffff0|e+1&&|l@1|o|/|t|h|e|r+0&&|e| @8
+ |~+0#4040ff13&| @18
+ |~| @18
+ |:+0#0000000&|%|s|;|e|l@1|o|/|t|h|e> @7
*** ../vim-8.2.0294/src/testdir/test_search.vim 2020-02-18 21:54:36.982093690 
+0100
--- src/testdir/test_search.vim 2020-02-21 21:18:43.934882059 +0100
***************
*** 1084,1089 ****
--- 1084,1113 ----
    call delete('Xis_subst_script')
  endfunc
  
+ func Test_incsearch_highlighting()
+   if !exists('+incsearch')
+     return
+   endif
+   if !CanRunVimInTerminal()
+     throw 'Skipped: cannot make screendumps'
+   endif
+ 
+   call writefile([
+       \ 'set incsearch hlsearch',
+       \ 'call setline(1, "hello/there")',
+       \ ], 'Xis_subst_hl_script')
+   let buf = RunVimInTerminal('-S Xis_subst_hl_script', {'rows': 4, 'cols': 
20})
+   " Give Vim a chance to redraw to get rid of the spaces in line 2 caused by
+   " the 'ambiwidth' check.
+   sleep 300m
+ 
+   " Using a different search delimiter should still highlight matches
+   " that contain a '/'.
+   call term_sendkeys(buf, ":%s;ello/the")
+   call VerifyScreenDump(buf, 'Test_incsearch_substitute_15', {})
+   call term_sendkeys(buf, "<Esc>")
+ endfunc
+ 
  func Test_incsearch_with_change()
    if !has('timers') || !exists('+incsearch') || !CanRunVimInTerminal()
      throw 'Skipped: cannot make screendumps and/or timers feature and/or 
incsearch option missing'
*** ../vim-8.2.0294/src/version.c       2020-02-21 18:41:49.249885543 +0100
--- src/version.c       2020-02-21 21:30:11.172073034 +0100
***************
*** 740,741 ****
--- 740,743 ----
  {   /* Add new patch number below this line */
+ /**/
+     295,
  /**/

-- 
I AM THANKFUL...
...for the piles of laundry and ironing because it means I
have plenty of clothes to wear.

 /// 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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202002212031.01LKVTD7006654%40masaka.moolenaar.net.

Raspunde prin e-mail lui