Patch 9.0.0139
Problem:    Truncating virtual text after a line not implemented.
            Cursor positioning wrong with Newline in the text.
Solution:   Implement truncating.  Disallow control characters in the text.
            (closes #10842)
Files:      src/drawline.c, src/structs.h, src/charset.c,
            src/proto/charset.pro, src/testdir/test_textprop.vim,
            src/testdir/dumps/Test_prop_with_text_after_trunc_1.dump,
            src/testdir/dumps/Test_prop_with_text_after_trunc_2.dump,
            src/testdir/dumps/Test_prop_with_text_after_trunc_3.dump,
            src/testdir/dumps/Test_prop_with_text_after_trunc_4.dump,
            src/testdir/dumps/Test_prop_with_text_after_trunc_5.dump,
            src/testdir/dumps/Test_prop_with_text_after_wraps_1.dump


*** ../vim-9.0.0138/src/drawline.c      2022-08-01 16:50:58.869575285 +0100
--- src/drawline.c      2022-08-04 14:53:51.782503874 +0100
***************
*** 1554,1559 ****
--- 1554,1561 ----
                                                        & TP_FLAG_ALIGN_RIGHT);
                            int     below = (text_props[used_tpi].tp_flags
                                                        & TP_FLAG_ALIGN_BELOW);
+                           int     wrap = (text_props[used_tpi].tp_flags
+                                                       & TP_FLAG_WRAP);
  
                            p_extra = p;
                            c_extra = NUL;
***************
*** 1566,1591 ****
                                // don't combine char attr after EOL
                                text_prop_combine = FALSE;
  
!                           // TODO: truncation if it doesn't fit
!                           if (right || below)
                            {
                                int     added = wp->w_width - col;
                                char_u  *l;
  
!                               // Right-align: fill with spaces
!                               if (right)
!                                   added -= vim_strsize(p_extra);
!                               if (added < 0 || (below && col == 0))
!                                   added = 0;
!                               l = alloc(n_extra + added + 1);
!                               if (l != NULL)
                                {
!                                   vim_memset(l, ' ', added);
!                                   STRCPY(l + added, p);
!                                   vim_free(p_extra_free);
!                                   p_extra = p_extra_free = l;
!                                   n_extra += added;
!                                   n_attr_skip = added;
                                }
                            }
                        }
--- 1568,1620 ----
                                // don't combine char attr after EOL
                                text_prop_combine = FALSE;
  
!                           // Keep in sync with where
!                           // textprop_size_after_trunc() is called in
!                           // win_lbr_chartabsize().
!                           if ((right || below || !wrap) && wp->w_width > 2)
                            {
                                int     added = wp->w_width - col;
+                               int     n_used = n_extra;
                                char_u  *l;
+                               int     strsize = wrap
+                                           ? vim_strsize(p_extra)
+                                           : textprop_size_after_trunc(wp,
+                                              below, added, p_extra, &n_used);
  
!                               if (wrap || right || below || n_used < n_extra)
                                {
!                                   // Right-align: fill with spaces
!                                   if (right)
!                                       added -= strsize;
!                                   if (added < 0 || (below && col == 0)
!                                              || (!below && n_used < n_extra))
!                                       added = 0;
!                                   // add 1 for NUL, 2 for when '…' is used
!                                   l = alloc(n_used + added + 3);
!                                   if (l != NULL)
!                                   {
!                                       vim_memset(l, ' ', added);
!                                       vim_strncpy(l + added, p_extra, n_used);
!                                       if (n_used < n_extra)
!                                       {
!                                           char_u *lp = l + added + n_used - 1;
! 
!                                           if (has_mbyte)
!                                           {
!                                               // change last character to '…'
!                                               lp -= (*mb_head_off)(l, lp);
!                                               STRCPY(lp, "…");
!                                               n_used = lp - l + 3;
!                                           }
!                                           else
!                                               // change last character to '>'
!                                               *lp = '>';
!                                       }
!                                       vim_free(p_extra_free);
!                                       p_extra = p_extra_free = l;
!                                       n_extra = n_used + added;
!                                       n_attr_skip = added;
!                                   }
                                }
                            }
                        }
***************
*** 1598,1603 ****
--- 1627,1640 ----
                        text_prop_follows = other_tpi != -1;
                    }
                }
+               else if (text_prop_next < text_prop_count
+                          && text_props[text_prop_next].tp_col == MAXCOL
+                          && *ptr != NUL
+                          && ptr[mb_ptr2len(ptr)] == NUL)
+                   // When at last-but-one character and a text property
+                   // follows after it, we may need to flush the line after
+                   // displaying that character.
+                   text_prop_follows = TRUE;
            }
  #endif
  
*** ../vim-9.0.0138/src/structs.h       2022-07-31 17:11:47.898558951 +0100
--- src/structs.h       2022-08-03 21:39:12.406065001 +0100
***************
*** 815,820 ****
--- 815,822 ----
  
  #define TP_FLAG_WRAP          0x40    // virtual text wraps - when missing
                                        // text is truncated
+ #define PROP_TEXT_MIN_CELLS   4       // minimun number of cells to use for
+                                       // the text, even when truncating
  
  /*
   * Structure defining a property type.
*** ../vim-9.0.0138/src/charset.c       2022-08-04 13:01:44.765330918 +0100
--- src/charset.c       2022-08-04 14:52:40.530685659 +0100
***************
*** 655,660 ****
--- 655,663 ----
      int
  ptr2cells(char_u *p)
  {
+     if (!has_mbyte)
+       return byte2cells(*p);
+ 
      // For UTF-8 we need to look at more bytes if the first byte is >= 0x80.
      if (enc_utf8 && *p >= 0x80)
        return utf_ptr2cells(p);
***************
*** 682,697 ****
      int               size = 0;
  
      while (*s != NUL && --len >= 0)
!       if (has_mbyte)
!       {
!           int     l = (*mb_ptr2len)(s);
  
!           size += ptr2cells(s);
!           s += l;
!           len -= l - 1;
!       }
!       else
!           size += byte2cells(*s++);
  
      return size;
  }
--- 685,697 ----
      int               size = 0;
  
      while (*s != NUL && --len >= 0)
!     {
!       int         l = (*mb_ptr2len)(s);
  
!       size += ptr2cells(s);
!       s += l;
!       len -= l - 1;
!     }
  
      return size;
  }
***************
*** 1026,1031 ****
--- 1026,1065 ----
      return retval;
  }
  
+ #if defined(FEAT_PROP_POPUP) || defined(PROTO)
+ /*
+  * Return the cell size of virtual text after truncation.
+  */
+     int
+ textprop_size_after_trunc(
+       win_T   *wp,
+       int     below,
+       int     added,
+       char_u  *text,
+       int     *n_used_ptr)
+ {
+     int       space = below ? wp->w_width : added;
+     int len = (int)STRLEN(text);
+     int strsize = 0;
+     int n_used;
+ 
+     // if the remaining size is to small wrap
+     // anyway and use the next line
+     if (space < PROP_TEXT_MIN_CELLS)
+       space += wp->w_width;
+     for (n_used = 0; n_used < len; n_used += (*mb_ptr2len)(text + n_used))
+     {
+       int clen = ptr2cells(text + n_used);
+ 
+       if (strsize + clen > space)
+           break;
+       strsize += clen;
+     }
+     *n_used_ptr = n_used;
+     return strsize;
+ }
+ #endif
+ 
  /*
   * Return the screen size of the character indicated by "cts".
   * "cts->cts_cur_text_width" is set to the extra size for a text property that
***************
*** 1110,1125 ****
            {
                char_u *p = ((char_u **)wp->w_buffer->b_textprop_text.ga_data)[
                                                               -tp->tp_id - 1];
!               int len = vim_strsize(p);
  
                if (tp->tp_col == MAXCOL)
                {
!                   // TODO: truncating
!                   if (tp->tp_flags & TP_FLAG_ALIGN_BELOW)
!                       len += wp->w_width - (vcol + size) % wp->w_width;
                }
!               cts->cts_cur_text_width += len;
!               size += len;
            }
            if (tp->tp_col - 1 > col)
                break;
--- 1144,1171 ----
            {
                char_u *p = ((char_u **)wp->w_buffer->b_textprop_text.ga_data)[
                                                               -tp->tp_id - 1];
!               int     cells = vim_strsize(p);
  
+               added = wp->w_width - (vcol + size) % wp->w_width;
                if (tp->tp_col == MAXCOL)
                {
!                   int below = (tp->tp_flags & TP_FLAG_ALIGN_BELOW);
!                   int wrap = (tp->tp_flags & TP_FLAG_WRAP);
!                   int len = (int)STRLEN(p);
!                   int n_used = len;
! 
!                   // Keep in sync with where textprop_size_after_trunc() is
!                   // called in win_line().
!                   if (!wrap)
!                       cells = textprop_size_after_trunc(wp,
!                                                    below, added, p, &n_used);
!                   // right-aligned does not really matter here, same as
!                   // "after"
!                   if (below)
!                       cells += wp->w_width - (vcol + size) % wp->w_width;
                }
!               cts->cts_cur_text_width += cells;
!               size += cells;
            }
            if (tp->tp_col - 1 > col)
                break;
*** ../vim-9.0.0138/src/proto/charset.pro       2022-08-04 13:01:44.765330918 
+0100
--- src/proto/charset.pro       2022-08-04 13:52:24.423660017 +0100
***************
*** 33,38 ****
--- 33,39 ----
  void clear_chartabsize_arg(chartabsize_T *cts);
  int lbr_chartabsize(chartabsize_T *cts);
  int lbr_chartabsize_adv(chartabsize_T *cts);
+ int textprop_size_after_trunc(win_T *wp, int below, int added, char_u *text, 
int *n_used_ptr);
  int win_lbr_chartabsize(chartabsize_T *cts, int *headp);
  void getvcol(win_T *wp, pos_T *pos, colnr_T *start, colnr_T *cursor, colnr_T 
*end);
  colnr_T getvcol_nolist(pos_T *posp);
*** ../vim-9.0.0138/src/testdir/test_textprop.vim       2022-08-02 
11:48:48.295757318 +0100
--- src/testdir/test_textprop.vim       2022-08-04 15:01:09.125440149 +0100
***************
*** 2286,2291 ****
--- 2286,2355 ----
    call delete('XscriptPropsWithTextAfterJoined')
  endfunc
  
+ func Test_props_with_text_after_truncated()
+   CheckRunVimInTerminal
+ 
+   let lines =<< trim END
+       call setline(1, ['one two three four five six seven'])
+       call prop_type_add('afterprop', #{highlight: 'Search'})
+       call prop_add(1, 0, #{type: 'afterprop', text: ' ONE and TWO and THREE 
and FOUR and FIVE'})
+ 
+       call setline(2, ['one two three four five six seven'])
+       call prop_add(2, 0, #{type: 'afterprop', text: ' one AND two AND three 
AND four AND five', text_align: 'right'})
+ 
+       call setline(3, ['one two three four five six seven'])
+       call prop_add(3, 0, #{type: 'afterprop', text: ' one AND two AND three 
AND four AND five lets wrap after some more text', text_align: 'below'})
+ 
+       call setline(4, ['cursor here'])
+       normal 4Gfh
+   END
+   call writefile(lines, 'XscriptPropsWithTextAfterTrunc')
+   let buf = RunVimInTerminal('-S XscriptPropsWithTextAfterTrunc', #{rows: 9, 
cols: 60})
+   call VerifyScreenDump(buf, 'Test_prop_with_text_after_trunc_1', {})
+ 
+   call term_sendkeys(buf, ":37vsp\<CR>gg")
+   call VerifyScreenDump(buf, 'Test_prop_with_text_after_trunc_2', {})
+ 
+   call term_sendkeys(buf, ":36wincmd |\<CR>")
+   call term_sendkeys(buf, "2G$")
+   call VerifyScreenDump(buf, 'Test_prop_with_text_after_trunc_3', {})
+ 
+   call term_sendkeys(buf, ":33wincmd |\<CR>")
+   call VerifyScreenDump(buf, 'Test_prop_with_text_after_trunc_4', {})
+ 
+   call term_sendkeys(buf, ":18wincmd |\<CR>")
+   call term_sendkeys(buf, "0fx")
+   call VerifyScreenDump(buf, 'Test_prop_with_text_after_trunc_5', {})
+ 
+   call StopVimInTerminal(buf)
+   call delete('XscriptPropsWithTextAfterTrunc')
+ endfunc
+ 
+ func Test_props_with_text_after_wraps()
+   CheckRunVimInTerminal
+ 
+   let lines =<< trim END
+       call setline(1, ['one two three four five six seven'])
+       call prop_type_add('afterprop', #{highlight: 'Search'})
+       call prop_add(1, 0, #{type: 'afterprop', text: ' ONE and TWO and THREE 
and FOUR and FIVE', text_wrap: 'wrap'})
+ 
+       call setline(2, ['one two three four five six seven'])
+       call prop_add(2, 0, #{type: 'afterprop', text: ' one AND two AND three 
AND four AND five', text_align: 'right', text_wrap: 'wrap'})
+ 
+       call setline(3, ['one two three four five six seven'])
+       call prop_add(3, 0, #{type: 'afterprop', text: ' one AND two AND three 
AND four AND five lets wrap after some more text', text_align: 'below', 
text_wrap: 'wrap'})
+ 
+       call setline(4, ['cursor here'])
+       normal 4Gfh
+   END
+   call writefile(lines, 'XscriptPropsWithTextAfterWraps')
+   let buf = RunVimInTerminal('-S XscriptPropsWithTextAfterWraps', #{rows: 9, 
cols: 60})
+   call VerifyScreenDump(buf, 'Test_prop_with_text_after_wraps_1', {})
+ 
+   call StopVimInTerminal(buf)
+   call delete('XscriptPropsWithTextAfterWraps')
+ endfunc
+ 
  func Test_removed_prop_with_text_cleans_up_array()
    new
    call setline(1, 'some text here')
*** ../vim-9.0.0138/src/testdir/dumps/Test_prop_with_text_after_trunc_1.dump    
2022-08-04 15:02:44.857215391 +0100
--- src/testdir/dumps/Test_prop_with_text_after_trunc_1.dump    2022-08-04 
14:36:51.237747576 +0100
***************
*** 0 ****
--- 1,9 ----
+ |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| 
|s|e|v|e|n| +0&#ffff4012|O|N|E| |a|n|d| |T|W|O| |a|n|d| |T|H|R|E@1| |a|n|d|…
+ |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| 
|s|e|v|e|n| +0&#ffff4012|o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|D|…
+ |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| 
|s|e|v|e|n| @26
+ | +0&#ffff4012|o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|D| |f|o|u|r| 
|A|N|D| |f|i|v|e| |l|e|t|s| |w|r|a|p| |a|f|t|e|r| |s|o|…
+ |c+0&#ffffff0|u|r|s|o|r| >h|e|r|e| @48
+ |~+0#4040ff13&| @58
+ |~| @58
+ |~| @58
+ | +0#0000000&@41|4|,|8| @10|A|l@1| 
*** ../vim-9.0.0138/src/testdir/dumps/Test_prop_with_text_after_trunc_2.dump    
2022-08-04 15:02:44.865215371 +0100
--- src/testdir/dumps/Test_prop_with_text_after_trunc_2.dump    2022-08-04 
14:36:52.401742439 +0100
***************
*** 0 ****
--- 1,9 ----
+ >o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| 
|s|e|v|e|n| +0&#ffff4012|O|N|…||+1&#ffffff0|o+0&&|n|e| |t|w|o| |t|h|r|e@1| 
|f|o|u|r| |f|i|v
+ |o|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e|n| 
+0&#ffff4012|o|n|…||+1&#ffffff0|e+0&&| |s|i|x| |s|e|v|e|n| +0&#ffff4012|o|n|e| 
|A|N|D| |t|…
+ |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| 
|s|e|v|e|n| @3||+1&&|o+0&&|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v
+ | +0&#ffff4012|o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|D| |f|o|u|r| 
|A|N|D| |…||+1&#ffffff0|e+0&&| |s|i|x| |s|e|v|e|n| @10
+ |c|u|r|s|o|r| |h|e|r|e| @25||+1&&| +0&#ffff4012|o|n|e| |A|N|D| |t|w|o| 
|A|N|D| |t|h|r|e|…
+ |~+0#4040ff13#ffffff0| @35||+1#0000000&|c+0&&|u|r|s|o|r| |h|e|r|e| @10
+ |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @20
+ |[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @5|1|,|1| @11|A|l@1| |<+1&&|N|a|m|e|]| 
|[|+|]| |4|,|8| @4|B|o|t
+ |:+0&&|3|7|v|s|p| @53
*** ../vim-9.0.0138/src/testdir/dumps/Test_prop_with_text_after_trunc_3.dump    
2022-08-04 15:02:44.869215362 +0100
--- src/testdir/dumps/Test_prop_with_text_after_trunc_3.dump    2022-08-04 
14:36:53.565737306 +0100
***************
*** 0 ****
--- 1,9 ----
+ |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| 
|s|e|v|e|n| +0&#ffff4012|O|N||+1&#ffffff0|o+0&&|n|e| |t|w|o| |t|h|r|e@1| 
|f|o|u|r| |f|i|v|e
+ |E+0&#ffff4012| |a|n|d| |T|W|O| |a|n|d| |T|H|R|E@1| |a|n|d| |F|O|U|R| |a|n|d| 
|F|I|…||+1&#ffffff0| +0&&|s|i|x| |s|e|v|e|n| +0&#ffff4012|o|n|e| |A|N|D| 
|t|w|o|…
+ |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| 
|s|e|v|e>n| +0&#ffff4012|o|n||+1&#ffffff0|o+0&&|n|e| |t|w|o| |t|h|r|e@1| 
|f|o|u|r| |f|i|v|e
+ |e+0&#ffff4012| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|D| |f|o|u|r| |A|N|D| 
|f|i|…||+1&#ffffff0| +0&&|s|i|x| |s|e|v|e|n| @12
+ |o|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e|n| @2||+1&&| 
+0&#ffff4012|o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1|…
+ | |o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|D| |f|o|u|r| 
|A|N|D|…||+1&#ffffff0|c+0&&|u|r|s|o|r| |h|e|r|e| @11
+ |c|u|r|s|o|r| |h|e|r|e| @24||+1&&|~+0#4040ff13&| @21
+ |[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @4|2|,|3@1| @10|A|l@1| |<+1&&| 
|N|a|m|e|]| |[|+|]| |4|,|8| @4|B|o|t
+ |:+0&&|3|6|w|i|n|c|m|d| ||| @48
*** ../vim-9.0.0138/src/testdir/dumps/Test_prop_with_text_after_trunc_4.dump    
2022-08-04 15:02:44.873215353 +0100
--- src/testdir/dumps/Test_prop_with_text_after_trunc_4.dump    2022-08-04 
14:36:54.733732163 +0100
***************
*** 0 ****
--- 1,9 ----
+ |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| 
|s|e|v|e|n||+1&&|o+0&&|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i
+ | +0&#ffff4012|O|N|E| |a|n|d| |T|W|O| |a|n|d| |T|H|R|E@1| |a|n|d| |F|O|U|R| 
|…||+1&#ffffff0|x+0&&| |s|e|v|e|n| +0&#ffff4012|o|n|e| |A|N|D| |t|w|o| |A|N|D| 
|t|…
+ |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| 
|s|e|v|e>n||+1&&|o+0&&|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i
+ | +0&#ffff4012|o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|D| |f|o|u|r| 
|…||+1&#ffffff0|x+0&&| |s|e|v|e|n| @18
+ |o|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e|n||+1&&| 
+0&#ffff4012|o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|…
+ | |o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|D| |f|o|u|r| 
|…||+1&#ffffff0|c+0&&|u|r|s|o|r| |h|e|r|e| @14
+ |c|u|r|s|o|r| |h|e|r|e| @21||+1&&|~+0#4040ff13&| @24
+ |[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @3|2|,|3@1| @8|A|l@1| |<+1&&|o| 
|N|a|m|e|]| |[|+|]| |4|,|8| @6|B|o|t
+ |:+0&&|3@1|w|i|n|c|m|d| ||| @48
*** ../vim-9.0.0138/src/testdir/dumps/Test_prop_with_text_after_trunc_5.dump    
2022-08-04 15:02:44.877215345 +0100
--- src/testdir/dumps/Test_prop_with_text_after_trunc_5.dump    2022-08-04 
15:01:14.965426377 +0100
***************
*** 0 ****
--- 1,9 ----
+ |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r||+1&&|o+0&&|n|e| |t|w|o| 
|t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e|n| +0&#ffff4012|o|n|e| |A|N|…
+ | +0&#ffffff0|f|i|v|e| |s|i|x| |s|e|v|e|n| 
+0&#ffff4012|O|N||+1&#ffffff0|o+0&&|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| 
|f|i|v|e| |s|i|x| |s|e|v|e|n| @7
+ |E+0&#ffff4012| |a|n|d| |T|W|O| |a|n|d| |T|H|R|…||+1&#ffffff0| 
+0&#ffff4012|o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|D| |f|o|u|r| 
|A|N|D| |f|i|v|e|…
+ |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r||+1&&|c+0&&|u|r|s|o|r| 
|h|e|r|e| @29
+ @1|f|i|v|e| |s|i>x| |s|e|v|e|n| +0&#ffff4012|o|n||+1&#ffffff0|~+0#4040ff13&| 
@39
+ |e+0#0000000#ffff4012| |A|N|D| |t|w|o| |A|N|D| 
|t|h|r|…||+1&#ffffff0|~+0#4040ff13&| @39
+ |@@2| @14||+1#0000000&|~+0#4040ff13&| @39
+ |<+3#0000000&|m|e|]| |[|+|]| |2|,|2|7| @1|T|o|p| |[+1&&|N|o| |N|a|m|e|]| 
|[|+|]| @9|4|,|8| @11|B|o|t
+ |:+0&&|1|8|w|i|n|c|m|d| ||| @48
*** ../vim-9.0.0138/src/testdir/dumps/Test_prop_with_text_after_wraps_1.dump    
2022-08-04 15:02:44.881215334 +0100
--- src/testdir/dumps/Test_prop_with_text_after_wraps_1.dump    2022-08-02 
21:45:50.596698045 +0100
***************
*** 0 ****
--- 1,9 ----
+ |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| 
|s|e|v|e|n| +0&#ffff4012|O|N|E| |a|n|d| |T|W|O| |a|n|d| |T|H|R|E@1| |a|n|d| 
+ |F|O|U|R| |a|n|d| |F|I|V|E| +0&#ffffff0@46
+ |o|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e|n| 
+0&#ffff4012|o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|D| 
+ |f|o|u|r| |A|N|D| |f|i|v|e| +0&#ffffff0@46
+ |o|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e|n| @26
+ | +0&#ffff4012|o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|D| |f|o|u|r| 
|A|N|D| |f|i|v|e| |l|e|t|s| |w|r|a|p| |a|f|t|e|r| |s|o|m
+ |e| |m|o|r|e| |t|e|x|t| +0&#ffffff0@48
+ |c|u|r|s|o|r| >h|e|r|e| @48
+ @42|4|,|8| @10|A|l@1| 
*** ../vim-9.0.0138/src/version.c       2022-08-04 13:01:44.769330917 +0100
--- src/version.c       2022-08-04 15:02:31.893245711 +0100
***************
*** 737,738 ****
--- 737,740 ----
  {   /* Add new patch number below this line */
+ /**/
+     139,
  /**/

-- 
A man is incomplete until he's married ... and then he's finished!

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            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/20220804140419.7D5841C07B3%40moolenaar.net.

Raspunde prin e-mail lui