changeset 28865:a04815de0bd3 v8.2.4955

patch 8.2.4955: text property in wrong position after auto-indent Commit: https://github.com/vim/vim/commit/788c06a2492b546dd0824b119251cd8ea7da9cb5 Author: LemonBoy <thatlemon@gmail.com> Date: Sat May 14 18:48:05 2022 +0100 patch 8.2.4955: text property in wrong position after auto-indent Problem: Text property in wrong position after auto-indent. Solution: Adjust text property columns. (closes https://github.com/vim/vim/issues/10422, closes https://github.com/vim/vim/issues/7719)
author Bram Moolenaar <Bram@vim.org>
date Sat, 14 May 2022 20:00:05 +0200
parents 1df04dc2fa27
children d3ed0c33e955
files src/change.c src/testdir/test_textprop.vim src/version.c
diffstat 3 files changed, 24 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/change.c
+++ b/src/change.c
@@ -1372,7 +1372,8 @@ open_line(
     char_u	*next_line = NULL;	// copy of the next line
     char_u	*p_extra = NULL;	// what goes to next line
     int		less_cols = 0;		// less columns for mark in new line
-    int		less_cols_off = 0;	// columns to skip for mark adjust
+    int		less_cols_off = 0;	// columns to skip for mark and
+					// textprop adjustment
     pos_T	old_cursor;		// old cursor position
     int		newcol = 0;		// new cursor column
     int		newindent = 0;		// auto-indent of the new line
@@ -2151,9 +2152,9 @@ open_line(
 	did_append = TRUE;
 #ifdef FEAT_PROP_POPUP
 	if ((State & MODE_INSERT) && (State & VREPLACE_FLAG) == 0)
-	    // properties after the split move to the next line
+	    // Properties after the split move to the next line.
 	    adjust_props_for_split(curwin->w_cursor.lnum, curwin->w_cursor.lnum,
-						  curwin->w_cursor.col + 1, 0);
+		    curwin->w_cursor.col + 1, 0);
 #endif
     }
     else
@@ -2248,6 +2249,12 @@ open_line(
 		    mark_col_adjust(curwin->w_cursor.lnum,
 					 curwin->w_cursor.col + less_cols_off,
 						      1L, (long)-less_cols, 0);
+#ifdef FEAT_PROP_POPUP
+		// Keep into account the deleted blanks on the new line.
+		if (curbuf->b_has_textprop && less_cols_off != 0)
+		    adjust_prop_columns(curwin->w_cursor.lnum + 1, 0,
+							    -less_cols_off, 0);
+#endif
 	    }
 	    else
 		changed_bytes(curwin->w_cursor.lnum, curwin->w_cursor.col);
--- a/src/testdir/test_textprop.vim
+++ b/src/testdir/test_textprop.vim
@@ -635,6 +635,18 @@ func Test_prop_open_line()
   call assert_equal(expected, prop_list(2))
   call DeletePropTypes()
 
+  " split at the space character with 'ai' active, the leading space is removed
+  " in the second line and the prop is shifted accordingly.
+  let expected = SetupOneLine() " 'xonex xtwoxx'
+  set ai
+  exe "normal 6|i\<CR>\<Esc>"
+  call assert_equal('xonex', getline(1))
+  call assert_equal('xtwoxx', getline(2))
+  let expected[1].col -= 6
+  call assert_equal(expected, prop_list(1) + prop_list(2))
+  set ai&
+  call DeletePropTypes()
+
   bwipe!
   set bs&
 endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    4955,
+/**/
     4954,
 /**/
     4953,