]> granicus.if.org Git - vim/commitdiff
patch 8.1.2308: deleting text before zero-width textprop removes it v8.1.2308
authorBram Moolenaar <Bram@vim.org>
Sat, 16 Nov 2019 19:41:51 +0000 (20:41 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 16 Nov 2019 19:41:51 +0000 (20:41 +0100)
Problem:    Deleting text before zero-width textprop removes it.
Solution:   Keep zero-width textprop when deleting text.

src/testdir/test_textprop.vim
src/textprop.c
src/version.c

index 467d833497ef5b7953a4c559cfac8dc7b9cbf47e..ded56a86009f90096dceb4da4ee6e9c4d8eecc45 100644 (file)
@@ -650,6 +650,35 @@ func Test_prop_undo()
   call prop_type_delete('comment')
 endfunc
 
+func Test_prop_delete_text()
+  new
+  call prop_type_add('comment', {'highlight': 'Directory'})
+  call setline(1, ['oneone', 'twotwo', 'three'])
+
+  " zero length property
+  call prop_add(1, 3, {'type': 'comment'})
+  let expected = [{'col': 3, 'length': 0, 'id': 0, 'type': 'comment', 'start': 1, 'end': 1} ]
+  call assert_equal(expected, prop_list(1))
+
+  " delete one char moves the property
+  normal! x
+  let expected = [{'col': 2, 'length': 0, 'id': 0, 'type': 'comment', 'start': 1, 'end': 1} ]
+  call assert_equal(expected, prop_list(1))
+
+  " delete char of the property has no effect
+  normal! lx
+  let expected = [{'col': 2, 'length': 0, 'id': 0, 'type': 'comment', 'start': 1, 'end': 1} ]
+  call assert_equal(expected, prop_list(1))
+
+  " delete more chars moves property to first column, is not deleted
+  normal! 0xxxx
+  let expected = [{'col': 1, 'length': 0, 'id': 0, 'type': 'comment', 'start': 1, 'end': 1} ]
+  call assert_equal(expected, prop_list(1))
+
+  bwipe!
+  call prop_type_delete('comment')
+endfunc
+
 " screenshot test with textprop highlighting
 func Test_textprop_screenshot_various()
   CheckScreendump
index 71d671d6b8c7f7f62df4657fc536a2e7839a0acd..55844d3ba226253366b6b648e52c80f410fed623 100644 (file)
@@ -1075,10 +1075,13 @@ adjust_prop_columns(
        }
        else if (bytes_added <= 0 && (tmp_prop.tp_col > col + 1))
        {
+           int len_changed = FALSE;
+
            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;
+               len_changed = TRUE;
            }
            else
                tmp_prop.tp_col += bytes_added;
@@ -1086,7 +1089,7 @@ adjust_prop_columns(
            if ((flags & APC_SAVE_FOR_UNDO) && !dirty)
                u_savesub(lnum);
            dirty = TRUE;
-           if (tmp_prop.tp_len <= 0)
+           if (len_changed && tmp_prop.tp_len <= 0)
                continue;  // drop this text property
        }
        else if (tmp_prop.tp_len > 0
index a682517de2320ed2a9164a02f8ddb8ae21a6c31e..00aa9e8e3a1b44f2b6e10b66294e4eef97e8333f 100644 (file)
@@ -741,6 +741,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2308,
 /**/
     2307,
 /**/