Patch 8.2.4960
Problem: Text properties that cross line boundary are not correctly updated
for a deleted line.
Solution: Correct computing location of text property entry. (Paul Ollis,
closes #10431, closes #10430)
Files: src/memline.c, src/testdir/test_textprop.vim
*** ../vim-8.2.4959/src/memline.c 2022-04-15 13:53:30.052708679 +0100
--- src/memline.c 2022-05-15 22:24:08.216227438 +0100
***************
*** 3501,3508 ****
#ifdef FEAT_PROP_POPUP
/*
* Adjust text properties in line "lnum" for a deleted line.
! * When "above" is true this is the line above the deleted line.
! * "del_props" are the properties of the deleted line.
*/
static void
adjust_text_props_for_delete(
--- 3501,3509 ----
#ifdef FEAT_PROP_POPUP
/*
* Adjust text properties in line "lnum" for a deleted line.
! * When "above" is true this is the line above the deleted line, otherwise
this
! * is the line below the deleted line.
! * "del_props[del_props_len]" are the properties of the deleted line.
*/
static void
adjust_text_props_for_delete(
***************
*** 3569,3575 ****
: TP_FLAG_CONT_PREV;
textprop_T prop_this;
! mch_memmove(&prop_this, text + textlen + done_del,
sizeof(textprop_T));
if ((prop_this.tp_flags & flag)
&& prop_del.tp_id == prop_this.tp_id
--- 3570,3576 ----
: TP_FLAG_CONT_PREV;
textprop_T prop_this;
! mch_memmove(&prop_this, text + textlen + done_this,
sizeof(textprop_T));
if ((prop_this.tp_flags & flag)
&& prop_del.tp_id == prop_this.tp_id
***************
*** 3577,3583 ****
{
found = TRUE;
prop_this.tp_flags &= ~flag;
! mch_memmove(text + textlen + done_del, &prop_this,
sizeof(textprop_T));
break;
}
--- 3578,3584 ----
{
found = TRUE;
prop_this.tp_flags &= ~flag;
! mch_memmove(text + textlen + done_this, &prop_this,
sizeof(textprop_T));
break;
}
*** ../vim-8.2.4959/src/testdir/test_textprop.vim 2022-05-15
13:07:58.366684986 +0100
--- src/testdir/test_textprop.vim 2022-05-15 22:23:43.248253327 +0100
***************
*** 1645,1650 ****
--- 1645,1701 ----
bwipe!
enddef
+ " This test is to detect a regression related to #10430. It is not an attempt
+ " fully cover deleting lines in the presence of multi-line properties.
+ def Test_delete_line_within_multiline_prop()
+ new
+ setline(1, '# Top.')
+ append(1, ['some_text = """', 'A string.', '"""', '# Bottom.'])
+ prop_type_add('Identifier', {'highlight': 'ModeMsg', 'priority': 0,
'combine': 0, 'start_incl': 0, 'end_incl': 0})
+ prop_type_add('String', {'highlight': 'MoreMsg', 'priority': 0, 'combine':
0, 'start_incl': 0, 'end_incl': 0})
+ prop_add(2, 1, {'type': 'Identifier', 'end_lnum': 2, 'end_col': 9})
+ prop_add(2, 13, {'type': 'String', 'end_lnum': 4, 'end_col': 4})
+
+ # The property for line 3 should extend into the previous and next lines.
+ var props = prop_list(3)
+ var prop = props[0]
+ assert_equal(1, len(props))
+ assert_equal(0, prop['start'])
+ assert_equal(0, prop['end'])
+
+ # This deletion should run without raising an exception.
+ try
+ :2 del
+ catch
+ assert_report('Line delete should have workd, but it raised an error.')
+ endtry
+
+ # The property for line 2 (was 3) should no longer extend into the previous
+ # line.
+ props = prop_list(2)
+ prop = props[0]
+ assert_equal(1, len(props))
+ assert_equal(1, prop['start'], 'Property was not changed to start within
the line.')
+
+ # This deletion should run without raising an exception.
+ try
+ :3 del
+ catch
+ assert_report('Line delete should have workd, but it raised an error.')
+ endtry
+
+ # The property for line 2 (originally 3) should no longer extend into the
next
+ # line.
+ props = prop_list(2)
+ prop = props[0]
+ assert_equal(1, len(props))
+ assert_equal(1, prop['end'], 'Property was not changed to end within the
line.')
+
+ prop_type_delete('Identifier')
+ prop_type_delete('String')
+ bwip!
+ enddef
+
func Test_prop_in_linebreak()
CheckRunVimInTerminal
*** ../vim-8.2.4959/src/version.c 2022-05-15 14:50:08.738042956 +0100
--- src/version.c 2022-05-15 22:22:14.592345742 +0100
***************
*** 748,749 ****
--- 748,751 ----
{ /* Add new patch number below this line */
+ /**/
+ 4960,
/**/
--
hundred-and-one symptoms of being an internet addict:
206. You religiously respond immediately to e-mail, while ignoring
your growing pile of snail mail.
/// 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/20220515212529.620D51C076B%40moolenaar.net.