Patch 8.1.1375
Problem:    Without "TS" in 'shortmess' get a hit-enter prompt often.
Solution:   Always truncate the search message.  Also avoid putting it in the
            message history. (closes #4413)
Files:      src/search.c, src/main.c, src/testdir/test_search_stat.vim


*** ../vim-8.1.1374/src/search.c        2019-05-23 21:35:44.455922641 +0200
--- src/search.c        2019-05-24 13:05:13.405227544 +0200
***************
*** 1381,1390 ****
--- 1381,1409 ----
                                            && !cmd_silent && msg_silent == 0)
        {
            char_u      *trunc;
+           char_u      off_buf[40];
+           int         off_len = 0;
  
            // Compute msg_row early.
            msg_start();
  
+           // Get the offset, so we know how long it is.
+           if (spats[0].off.line || spats[0].off.end || spats[0].off.off)
+           {
+               p = off_buf;
+               *p++ = dirc;
+               if (spats[0].off.end)
+                   *p++ = 'e';
+               else if (!spats[0].off.line)
+                   *p++ = 's';
+               if (spats[0].off.off > 0 || spats[0].off.line)
+                   *p++ = '+';
+               *p = NUL;
+               if (spats[0].off.off != 0 || spats[0].off.line)
+                   sprintf((char *)p, "%ld", spats[0].off.off);
+               off_len = STRLEN(off_buf);
+           }
+ 
            if (*searchstr == NUL)
                p = spats[0].pat;
            else
***************
*** 1393,1411 ****
            if (!shortmess(SHM_SEARCHCOUNT))
            {
                // Reserve enough space for the search pattern + offset +
!               // search stat.
                if (msg_scrolled != 0)
                    // Use all the columns.
                    len = (int)(Rows - msg_row) * Columns - 1;
                else
                    // Use up to 'showcmd' column.
                    len = (int)(Rows - msg_row - 1) * Columns + sc_col - 1;
!               if (len < STRLEN(p) + 40 + SEARCH_STAT_BUF_LEN + 1)
!                   len = STRLEN(p) + 40 + SEARCH_STAT_BUF_LEN + 1;
            }
            else
                // Reserve enough space for the search pattern + offset.
!               len = STRLEN(p) + 40;
  
            msgbuf = alloc((int)len);
            if (msgbuf != NULL)
--- 1412,1432 ----
            if (!shortmess(SHM_SEARCHCOUNT))
            {
                // Reserve enough space for the search pattern + offset +
!               // search stat.  Use all the space available, so that the
!               // search state is right aligned.  If there is not enough space
!               // msg_strtrunc() will shorten in the middle.
                if (msg_scrolled != 0)
                    // Use all the columns.
                    len = (int)(Rows - msg_row) * Columns - 1;
                else
                    // Use up to 'showcmd' column.
                    len = (int)(Rows - msg_row - 1) * Columns + sc_col - 1;
!               if (len < STRLEN(p) + off_len + SEARCH_STAT_BUF_LEN + 3)
!                   len = STRLEN(p) + off_len + SEARCH_STAT_BUF_LEN + 3;
            }
            else
                // Reserve enough space for the search pattern + offset.
!               len = STRLEN(p) + off_len + 3;
  
            msgbuf = alloc((int)len);
            if (msgbuf != NULL)
***************
*** 1422,1446 ****
                }
                else
                    mch_memmove(msgbuf + 1, p, STRLEN(p));
!               if (spats[0].off.line || spats[0].off.end || spats[0].off.off)
!               {
!                   p = msgbuf + STRLEN(p) + 1;
!                   *p++ = dirc;
!                   if (spats[0].off.end)
!                       *p++ = 'e';
!                   else if (!spats[0].off.line)
!                       *p++ = 's';
!                   if (spats[0].off.off > 0 || spats[0].off.line)
!                       *p++ = '+';
!                   if (spats[0].off.off != 0 || spats[0].off.line)
!                   {
!                       int l = 0;
!                       l = sprintf((char *)p, "%ld", spats[0].off.off);
!                       p[l] = ' '; // remove NUL from sprintf
!                   }
!               }
  
!               trunc = msg_strtrunc(msgbuf, FALSE);
                if (trunc != NULL)
                {
                    vim_free(msgbuf);
--- 1443,1452 ----
                }
                else
                    mch_memmove(msgbuf + 1, p, STRLEN(p));
!               if (off_len > 0)
!                   mch_memmove(msgbuf + STRLEN(p) + 1, off_buf, off_len);
  
!               trunc = msg_strtrunc(msgbuf, TRUE);
                if (trunc != NULL)
                {
                    vim_free(msgbuf);
***************
*** 5028,5035 ****
        lbuf    = curbuf;
        lastpos = p;
  
!       // keep the message even after redraw
        give_warning(msgbuf, FALSE);
      }
      p_ws = save_ws;
  }
--- 5034,5043 ----
        lbuf    = curbuf;
        lastpos = p;
  
!       // keep the message even after redraw, but don't put in history
!       msg_hist_off = TRUE;
        give_warning(msgbuf, FALSE);
+       msg_hist_off = FALSE;
      }
      p_ws = save_ws;
  }
*** ../vim-8.1.1374/src/main.c  2019-05-23 21:35:44.455922641 +0200
--- src/main.c  2019-05-24 12:38:14.310483062 +0200
***************
*** 1271,1281 ****
            {
                char_u *p;
  
!               /* msg_attr_keep() will set keep_msg to NULL, must free the
!                * string here. Don't reset keep_msg, msg_attr_keep() uses it
!                * to check for duplicates. */
                p = keep_msg;
                msg_attr((char *)p, keep_msg_attr);
                vim_free(p);
            }
            if (need_fileinfo)          /* show file info after redraw */
--- 1271,1283 ----
            {
                char_u *p;
  
!               // msg_attr_keep() will set keep_msg to NULL, must free the
!               // string here. Don't reset keep_msg, msg_attr_keep() uses it
!               // to check for duplicates.  Never put this message in history.
                p = keep_msg;
+               msg_hist_off = TRUE;
                msg_attr((char *)p, keep_msg_attr);
+               msg_hist_off = FALSE;
                vim_free(p);
            }
            if (need_fileinfo)          /* show file info after redraw */
*** ../vim-8.1.1374/src/testdir/test_search_stat.vim    2019-05-18 
19:26:25.973151461 +0200
--- src/testdir/test_search_stat.vim    2019-05-24 12:47:41.903233016 +0200
***************
*** 11,31 ****
    " Append 50 lines with text to search for, "foobar" appears 20 times
    call append(0, repeat(['foobar', 'foo', 'fooooobar', 'foba', 'foobar'], 10))
  
!   " 1) match at second line
    call cursor(1, 1)
    let @/ = 'fo*\(bar\?\)\?'
    let g:a = execute(':unsilent :norm! n')
    let stat = '\[2/50\]'
    let pat = escape(@/, '()*?'). '\s\+'
    call assert_match(pat .. stat, g:a)
  
!   " 2) Match at last line
    call cursor(line('$')-2, 1)
    let g:a = execute(':unsilent :norm! n')
    let stat = '\[50/50\]'
    call assert_match(pat .. stat, g:a)
  
!   " 3) No search stat
    set shortmess+=S
    call cursor(1, 1)
    let stat = '\[2/50\]'
--- 11,34 ----
    " Append 50 lines with text to search for, "foobar" appears 20 times
    call append(0, repeat(['foobar', 'foo', 'fooooobar', 'foba', 'foobar'], 10))
  
!   " match at second line
    call cursor(1, 1)
+   let messages_before = execute('messages')
    let @/ = 'fo*\(bar\?\)\?'
    let g:a = execute(':unsilent :norm! n')
    let stat = '\[2/50\]'
    let pat = escape(@/, '()*?'). '\s\+'
    call assert_match(pat .. stat, g:a)
+   " didn't get added to message history
+   call assert_equal(messages_before, execute('messages'))
  
!   " Match at last line
    call cursor(line('$')-2, 1)
    let g:a = execute(':unsilent :norm! n')
    let stat = '\[50/50\]'
    call assert_match(pat .. stat, g:a)
  
!   " No search stat
    set shortmess+=S
    call cursor(1, 1)
    let stat = '\[2/50\]'
***************
*** 33,39 ****
    call assert_notmatch(pat .. stat, g:a)
    set shortmess-=S
  
!   " 4) Many matches
    call cursor(line('$')-2, 1)
    let @/ = '.'
    let pat = escape(@/, '()*?'). '\s\+'
--- 36,42 ----
    call assert_notmatch(pat .. stat, g:a)
    set shortmess-=S
  
!   " Many matches
    call cursor(line('$')-2, 1)
    let @/ = '.'
    let pat = escape(@/, '()*?'). '\s\+'
***************
*** 45,51 ****
    let stat = '\[1/>99\] W'
    call assert_match(pat .. stat, g:a)
  
!   " 5) Many matches
    call cursor(1, 1)
    let g:a = execute(':unsilent :norm! n')
    let stat = '\[2/>99\]'
--- 48,54 ----
    let stat = '\[1/>99\] W'
    call assert_match(pat .. stat, g:a)
  
!   " Many matches
    call cursor(1, 1)
    let g:a = execute(':unsilent :norm! n')
    let stat = '\[2/>99\]'
***************
*** 55,61 ****
    let stat = '\[>99/>99\] W'
    call assert_match(pat .. stat, g:a)
  
!   " 6) right-left
    if exists("+rightleft")
      set rl
      call cursor(1,1)
--- 58,64 ----
    let stat = '\[>99/>99\] W'
    call assert_match(pat .. stat, g:a)
  
!   " right-left
    if exists("+rightleft")
      set rl
      call cursor(1,1)
***************
*** 67,73 ****
      set norl
    endif
  
!   " 7) right-left bottom
    if exists("+rightleft")
      set rl
      call cursor('$',1)
--- 70,76 ----
      set norl
    endif
  
!   " right-left bottom
    if exists("+rightleft")
      set rl
      call cursor('$',1)
***************
*** 78,84 ****
      set norl
    endif
  
!   " 8) right-left back at top
    if exists("+rightleft")
      set rl
      call cursor('$',1)
--- 81,87 ----
      set norl
    endif
  
!   " right-left back at top
    if exists("+rightleft")
      set rl
      call cursor('$',1)
***************
*** 90,96 ****
      set norl
    endif
  
!   " 9) normal, back at bottom
    call cursor(1,1)
    let @/ = 'foobar'
    let pat = '?foobar\s\+'
--- 93,99 ----
      set norl
    endif
  
!   " normal, back at bottom
    call cursor(1,1)
    let @/ = 'foobar'
    let pat = '?foobar\s\+'
***************
*** 100,106 ****
    call assert_match('search hit TOP, continuing at BOTTOM', g:a)
    call assert_match('\[20/20\] W', Screenline(&lines))
  
!   " 10) normal, no match
    call cursor(1,1)
    let @/ = 'zzzzzz'
    let g:a = ''
--- 103,109 ----
    call assert_match('search hit TOP, continuing at BOTTOM', g:a)
    call assert_match('\[20/20\] W', Screenline(&lines))
  
!   " normal, no match
    call cursor(1,1)
    let @/ = 'zzzzzz'
    let g:a = ''
***************
*** 114,120 ****
      call assert_false(1)
    endtry
  
!   " 11) normal, n comes from a mapping
    "     Need to move over more than 64 lines to trigger char_avail(.
    nnoremap n nzv
    call cursor(1,1)
--- 117,123 ----
      call assert_false(1)
    endtry
  
!   " normal, n comes from a mapping
    "     Need to move over more than 64 lines to trigger char_avail(.
    nnoremap n nzv
    call cursor(1,1)
***************
*** 130,136 ****
    call assert_match(pat .. stat, g:b)
    unmap n
  
!   " 11) normal, but silent
    call cursor(1,1)
    let @/ = 'find this'
    let pat = '/find this\s\+'
--- 133,139 ----
    call assert_match(pat .. stat, g:b)
    unmap n
  
!   " normal, but silent
    call cursor(1,1)
    let @/ = 'find this'
    let pat = '/find this\s\+'
*** ../vim-8.1.1374/src/version.c       2019-05-24 11:45:18.987591736 +0200
--- src/version.c       2019-05-24 12:34:50.371607742 +0200
***************
*** 769,770 ****
--- 769,772 ----
  {   /* Add new patch number below this line */
+ /**/
+     1375,
  /**/

-- 
I have a drinking problem -- I can't afford it.

 /// 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/201905241112.x4OBC60f007117%40masaka.moolenaar.net.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui