Patch 8.1.1343
Problem:    Text properties not adjusted for Visual block mode delete.
Solution:   Call adjust_prop_columns(). (closes #4384)
Files:      src/ops.c, src/textprop.c, src/testdir/test_textprop.vim,
            src/misc1.c, src/testdir/dumps/Test_textprop_vis_01.dump,
            src/testdir/dumps/Test_textprop_vis_02.dump


*** ../vim-8.1.1342/src/ops.c   2019-05-17 20:17:36.277186167 +0200
--- src/ops.c   2019-05-17 21:09:38.183335755 +0200
***************
*** 1916,1925 ****
                curwin->w_cursor.coladd = 0;
            }
  
!           /* n == number of chars deleted
!            * If we delete a TAB, it may be replaced by several characters.
!            * Thus the number of characters may increase!
!            */
            n = bd.textlen - bd.startspaces - bd.endspaces;
            oldp = ml_get(lnum);
            newp = alloc_check((unsigned)STRLEN(oldp) + 1 - n);
--- 1916,1924 ----
                curwin->w_cursor.coladd = 0;
            }
  
!           // "n" == number of chars deleted
!           // If we delete a TAB, it may be replaced by several characters.
!           // Thus the number of characters may increase!
            n = bd.textlen - bd.startspaces - bd.endspaces;
            oldp = ml_get(lnum);
            newp = alloc_check((unsigned)STRLEN(oldp) + 1 - n);
***************
*** 1935,1940 ****
--- 1934,1944 ----
            STRMOVE(newp + bd.textcol + bd.startspaces + bd.endspaces, oldp);
            /* replace the line */
            ml_replace(lnum, newp, FALSE);
+ 
+ #ifdef FEAT_TEXT_PROP
+           if (curbuf->b_has_textprop && n != 0)
+               adjust_prop_columns(lnum, bd.textcol, -n);
+ #endif
        }
  
        check_cursor_col();
*** ../vim-8.1.1342/src/textprop.c      2019-05-17 19:56:29.860129184 +0200
--- src/textprop.c      2019-05-17 21:54:59.788551130 +0200
***************
*** 957,963 ****
   * shift by "bytes_added" (can be negative).
   * Note that "col" is zero-based, while tp_col is one-based.
   * Only for the current buffer.
!  * Called is expected to check b_has_textprop and "bytes_added" being 
non-zero.
   */
      void
  adjust_prop_columns(
--- 957,963 ----
   * shift by "bytes_added" (can be negative).
   * Note that "col" is zero-based, while tp_col is one-based.
   * Only for the current buffer.
!  * Caller is expected to check b_has_textprop and "bytes_added" being 
non-zero.
   */
      void
  adjust_prop_columns(
***************
*** 994,1008 ****
                                                                      ? 2 : 1))
                : (tmp_prop.tp_col > col + 1))
        {
!           tmp_prop.tp_col += bytes_added;
            dirty = TRUE;
        }
        else if (tmp_prop.tp_len > 0
                && tmp_prop.tp_col + tmp_prop.tp_len > col
                       + ((pt != NULL && (pt->pt_flags & PT_FLAG_INS_END_INCL))
                                                                      ? 0 : 1))
        {
!           tmp_prop.tp_len += bytes_added;
            dirty = TRUE;
            if (tmp_prop.tp_len <= 0)
                continue;  // drop this text property
--- 994,1021 ----
                                                                      ? 2 : 1))
                : (tmp_prop.tp_col > col + 1))
        {
!           if (tmp_prop.tp_col + bytes_added < col + 1)
!           {
!               tmp_prop.tp_len += (tmp_prop.tp_col - 1 - col) + bytes_added;
!               tmp_prop.tp_col = col + 1;
!           }
!           else
!               tmp_prop.tp_col += bytes_added;
            dirty = TRUE;
+           if (tmp_prop.tp_len <= 0)
+               continue;  // drop this text property
        }
        else if (tmp_prop.tp_len > 0
                && tmp_prop.tp_col + tmp_prop.tp_len > col
                       + ((pt != NULL && (pt->pt_flags & PT_FLAG_INS_END_INCL))
                                                                      ? 0 : 1))
        {
!           int after = col - bytes_added
!                                    - (tmp_prop.tp_col - 1 + tmp_prop.tp_len);
!           if (after > 0)
!               tmp_prop.tp_len += bytes_added + after;
!           else
!               tmp_prop.tp_len += bytes_added;
            dirty = TRUE;
            if (tmp_prop.tp_len <= 0)
                continue;  // drop this text property
*** ../vim-8.1.1342/src/testdir/test_textprop.vim       2019-05-17 
19:56:29.860129184 +0200
--- src/testdir/test_textprop.vim       2019-05-17 22:18:01.264176320 +0200
***************
*** 613,619 ****
  endfunc
  
  " screenshot test with textprop highlighting
! funct Test_textprop_screenshots()
    " The Vim running in the terminal needs to use utf-8.
    if !CanRunVimInTerminal() || g:orig_encoding != 'utf-8'
      return
--- 613,619 ----
  endfunc
  
  " screenshot test with textprop highlighting
! func Test_textprop_screenshot_various()
    " The Vim running in the terminal needs to use utf-8.
    if !CanRunVimInTerminal() || g:orig_encoding != 'utf-8'
      return
***************
*** 671,673 ****
--- 671,722 ----
    call StopVimInTerminal(buf)
    call delete('XtestProp')
  endfunc
+ 
+ func RunTestVisualBlock(width, dump)
+   call writefile([
+       \ "call setline(1, ["
+       \       .. "'xxxxxxxxx 123 x',"
+       \       .. "'xxxxxxxx 123 x',"
+       \       .. "'xxxxxxx 123 x',"
+       \       .. "'xxxxxx 123 x',"
+       \       .. "'xxxxx 123 x',"
+       \       .. "'xxxx 123 xx',"
+       \       .. "'xxx 123 xxx',"
+       \       .. "'xx 123 xxxx',"
+       \       .. "'x 123 xxxxx',"
+       \       .. "' 123 xxxxxx',"
+       \       .. "])",
+       \ "hi SearchProp ctermbg=yellow",
+       \ "call prop_type_add('search', {'highlight': 'SearchProp'})",
+       \ "call prop_add(1, 11, {'length': 3, 'type': 'search'})",
+       \ "call prop_add(2, 10, {'length': 3, 'type': 'search'})",
+       \ "call prop_add(3, 9, {'length': 3, 'type': 'search'})",
+       \ "call prop_add(4, 8, {'length': 3, 'type': 'search'})",
+       \ "call prop_add(5, 7, {'length': 3, 'type': 'search'})",
+       \ "call prop_add(6, 6, {'length': 3, 'type': 'search'})",
+       \ "call prop_add(7, 5, {'length': 3, 'type': 'search'})",
+       \ "call prop_add(8, 4, {'length': 3, 'type': 'search'})",
+       \ "call prop_add(9, 3, {'length': 3, 'type': 'search'})",
+       \ "call prop_add(10, 2, {'length': 3, 'type': 'search'})",
+       \ "normal 1G6|\<C-V>" .. repeat('l', a:width - 1) .. "10jx",
+       \], 'XtestPropVis')
+   let buf = RunVimInTerminal('-S XtestPropVis', {'rows': 12})
+   call VerifyScreenDump(buf, 'Test_textprop_vis_' .. a:dump, {})
+ 
+   " clean up
+   call StopVimInTerminal(buf)
+   call delete('XtestPropVis')
+ endfunc
+ 
+ " screenshot test with Visual block mode operations
+ func Test_textprop_screenshot_visual()
+   if !CanRunVimInTerminal()
+     return
+   endif
+ 
+   " Delete two columns while text props are three chars wide.
+   call RunTestVisualBlock(2, '01')
+ 
+   " Same, but delete four columns
+   call RunTestVisualBlock(4, '02')
+ endfunc
*** ../vim-8.1.1342/src/misc1.c 2019-05-11 17:03:55.166019785 +0200
--- src/misc1.c 2019-05-17 22:55:55.840537922 +0200
***************
*** 434,441 ****
                saved_cursor.col = (colnr_T)(s - newline);
        }
  #ifdef FEAT_TEXT_PROP
!       adjust_prop_columns(curwin->w_cursor.lnum, (colnr_T)(p - oldline),
!                                            ind_len - (colnr_T)(p - oldline));
  #endif
        retval = TRUE;
      }
--- 434,448 ----
                saved_cursor.col = (colnr_T)(s - newline);
        }
  #ifdef FEAT_TEXT_PROP
!       {
!           int added = ind_len - (colnr_T)(p - oldline);
! 
!           // When increasing indent this behaves like spaces were inserted at
!           // the old indent, when decreasing indent it behaves like spaces
!           // were deleted at the new indent.
!           adjust_prop_columns(curwin->w_cursor.lnum,
!                       (colnr_T)(added > 0 ? (p - oldline) : ind_len), added);
!       }
  #endif
        retval = TRUE;
      }
*** ../vim-8.1.1342/src/testdir/dumps/Test_textprop_vis_01.dump 2019-05-17 
22:56:37.016317697 +0200
--- src/testdir/dumps/Test_textprop_vis_01.dump 2019-05-17 22:18:08.928132508 
+0200
***************
*** 0 ****
--- 1,12 ----
+ |x+0&#ffffff0@4>x@1| |1+0&#ffff4012|2|3| +0&#ffffff0|x| @61
+ |x@5| |1+0&#ffff4012|2|3| +0&#ffffff0|x| @62
+ |x@4| |1+0&#ffff4012|2|3| +0&#ffffff0|x| @63
+ |x@4|1+0&#ffff4012|2|3| +0&#ffffff0|x| @64
+ |x@4|2+0&#ffff4012|3| +0&#ffffff0|x| @65
+ |x@3| |3+0&#ffff4012| +0&#ffffff0|x@1| @65
+ |x@2| |1+0&#ffff4012| +0&#ffffff0|x@2| @65
+ |x@1| |1+0&#ffff4012|2|x+0&#ffffff0@3| @65
+ |x| |1+0&#ffff4012|2|3|x+0&#ffffff0@3| @65
+ @1|1+0&#ffff4012|2|3| +0&#ffffff0|x@3| @65
+ |~+0#4040ff13&| @73
+ | +0#0000000&@56|1|,|6| @10|A|l@1| 
*** ../vim-8.1.1342/src/testdir/dumps/Test_textprop_vis_02.dump 2019-05-17 
22:56:37.020317676 +0200
--- src/testdir/dumps/Test_textprop_vis_02.dump 2019-05-17 22:18:10.028126220 
+0200
***************
*** 0 ****
--- 1,12 ----
+ |x+0&#ffffff0@4> |1+0&#ffff4012|2|3| +0&#ffffff0|x| @63
+ |x@4|1+0&#ffff4012|2|3| +0&#ffffff0|x| @64
+ |x@4|2+0&#ffff4012|3| +0&#ffffff0|x| @65
+ |x@4|3+0&#ffff4012| +0&#ffffff0|x| @66
+ |x@4| |x| @67
+ |x@3| |x@1| @67
+ |x@2| |1+0&#ffff4012|x+0&#ffffff0@1| @67
+ |x@1| |1+0&#ffff4012|2|x+0&#ffffff0@1| @67
+ |x| |1+0&#ffff4012|2|3|x+0&#ffffff0@1| @67
+ @1|1+0&#ffff4012|2|3| +0&#ffffff0|x@1| @67
+ |~+0#4040ff13&| @73
+ | +0#0000000&@56|1|,|6| @10|A|l@1| 
*** ../vim-8.1.1342/src/version.c       2019-05-17 20:17:36.277186167 +0200
--- src/version.c       2019-05-17 22:56:44.572277252 +0200
***************
*** 769,770 ****
--- 769,772 ----
  {   /* Add new patch number below this line */
+ /**/
+     1343,
  /**/

-- 
Your company is doomed if your primary product is overhead transparencies.
                                (Scott Adams - The Dilbert principle)

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

Raspunde prin e-mail lui