# HG changeset patch # User Bram Moolenaar # Date 1573933504 -3600 # Node ID e2d9f4d030fac8c197a6c75843206a2f7b9d7b6a # Parent 44d77ef80e78a4d4b25b6fd2944efd9cf7d5faa6 patch 8.1.2308: deleting text before zero-width textprop removes it Commit: https://github.com/vim/vim/commit/ecafcc15ca92ecb9c6b41dbb3b0fcdf89c9eff69 Author: Bram Moolenaar Date: Sat Nov 16 20:41:51 2019 +0100 patch 8.1.2308: deleting text before zero-width textprop removes it Problem: Deleting text before zero-width textprop removes it. Solution: Keep zero-width textprop when deleting text. diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim --- a/src/testdir/test_textprop.vim +++ b/src/testdir/test_textprop.vim @@ -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 diff --git a/src/textprop.c b/src/textprop.c --- a/src/textprop.c +++ b/src/textprop.c @@ -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 diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2308, +/**/ 2307, /**/ 2306,