changeset 29579:f7a64755dbe9 v9.0.0130

patch 9.0.0130: cursor position wrong when inserting around virtual text Commit: https://github.com/vim/vim/commit/1f4ee19eefecd8f70b7cbe8ee9db8ace6352e23e Author: Bram Moolenaar <Bram@vim.org> 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.
author Bram Moolenaar <Bram@vim.org>
date Mon, 01 Aug 2022 17:00:04 +0200
parents e64e9ba15acc
children 11db5a699881
files src/drawline.c src/edit.c src/testdir/dumps/Test_prop_inserts_text_1.dump src/testdir/dumps/Test_prop_inserts_text_2.dump src/testdir/test_textprop.vim src/version.c
diffstat 6 files changed, 29 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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);
 
     /*
--- 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+0&#5fd7ff255|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+0&#5fd7ff255|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| 
--- 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+0&#5fd7ff255|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+0&#5fd7ff255|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| 
--- 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
--- 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,