# HG changeset patch # User Bram Moolenaar # Date 1659366004 -7200 # Node ID f7a64755dbe9920960b4a3adfaa4742b39bc9094 # Parent e64e9ba15accfffd936055bd5c3af83022b46727 patch 9.0.0130: cursor position wrong when inserting around virtual text Commit: https://github.com/vim/vim/commit/1f4ee19eefecd8f70b7cbe8ee9db8ace6352e23e Author: Bram Moolenaar Date: Mon Aug 1 15:52:55 2022 +0100 patch 9.0.0130: cursor position wrong when inserting around virtual text Problem: Cursor position wrong when inserting around virtual text. Solution: Update the cursor position properly. diff --git a/src/drawline.c b/src/drawline.c --- a/src/drawline.c +++ b/src/drawline.c @@ -1589,13 +1589,6 @@ win_line( n_attr_skip = added; } } - - // If the cursor is on or after this position, - // move it forward. - if (wp == curwin - && lnum == curwin->w_cursor.lnum - && curwin->w_cursor.col >= vcol) - curwin->w_cursor.col += n_extra; } // reset the ID in the copy to avoid it being used // again diff --git a/src/edit.c b/src/edit.c --- a/src/edit.c +++ b/src/edit.c @@ -288,8 +288,13 @@ edit( conceal_check_cursor_line(cursor_line_was_concealed); #endif - // need to position cursor again when on a TAB - if (gchar_cursor() == TAB) + // Need to position cursor again when on a TAB and when on a char with + // virtual text. + if (gchar_cursor() == TAB +#ifdef FEAT_PROP_POPUP + || curbuf->b_has_textprop +#endif + ) curwin->w_valid &= ~(VALID_WROW|VALID_WCOL|VALID_VIRTCOL); /* diff --git a/src/testdir/dumps/Test_prop_inserts_text_1.dump b/src/testdir/dumps/Test_prop_inserts_text_1.dump --- a/src/testdir/dumps/Test_prop_inserts_text_1.dump +++ b/src/testdir/dumps/Test_prop_inserts_text_1.dump @@ -1,6 +1,6 @@ |i+0&#ffffff0|n|s|e|r|t| |s|o|m|e| |t|e|x|t| |S+0#ffffff16#e000002|O|M|E| |h+0#0000000#ffffff0|e|r|e| |a|n|d| |o|t|h|e|r| |t|e|x|t| |O+0&#ffff4012|T|H|E|R| |t+0&#ffffff0|h|e|r|e| |a|n|d| |s|o -|m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0fd7ff255|O|R|E| |w+0&#ffffff0|r|a|p@1|i|n|g> @27 +|m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0fd7ff255|O|R|E| |w+0&#ffffff0|r|a|p@1|i|n>g| @27 |~+0#4040ff13&| @58 |~| @58 |~| @58 -| +0#0000000&@41|1|,|7@1|-|9|3| @6|A|l@1| +| +0#0000000&@41|1|,|7|6|-|9|2| @6|A|l@1| diff --git a/src/testdir/dumps/Test_prop_inserts_text_2.dump b/src/testdir/dumps/Test_prop_inserts_text_2.dump --- a/src/testdir/dumps/Test_prop_inserts_text_2.dump +++ b/src/testdir/dumps/Test_prop_inserts_text_2.dump @@ -1,6 +1,6 @@ | +0#0000e05#a8a8a8255@1|i+0#0000000#ffffff0|n|s|e|r|t| |s|o|m|e| |t|e|x|t| |S+0#ffffff16#e000002|O|M|E| |h+0#0000000#ffffff0|e|r|e| |a|n|d| |o|t|h|e|r| |t|e|x|t| |O+0&#ffff4012|T|H|E|R| |t+0&#ffffff0|h|e|r|e| |a|n|d| -| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0fd7ff255|O|R|E| |w+0&#ffffff0|r|a|p@1|i|n|g> @23 +| +0#0000e05#a8a8a8255@1|s+0#0000000#ffffff0|o|m|e| |m|o|r|e| |t|e|x|t| |a|f|t|e|r| |M+0fd7ff255|O|R|E| |w+0&#ffffff0|r|a|p@1|i|n>g| @23 |~+0#4040ff13&| @58 |~| @58 |~| @58 -| +0#0000000&@41|1|,|7@1|-|9|3| @6|A|l@1| +| +0#0000000&@41|1|,|7|6|-|9|2| @6|A|l@1| 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 @@ -2256,4 +2256,20 @@ func Test_removed_prop_with_text_cleans_ bwipe! endfunc +def Test_insert_text_before_virtual_text() + new foobar + setline(1, '12345678') + prop_type_add('test', {highlight: 'Search'}) + prop_add(1, 5, { + type: 'test', + text: ' virtual text ' + }) + normal! f4axyz + normal! f5iXYZ + assert_equal('1234xyzXYZ5678', getline(1)) + + prop_type_delete('test') + bwipe! +enddef + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -736,6 +736,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 130, +/**/ 129, /**/ 128,