changeset 30257:45788c16b3a5 v9.0.0464

patch 9.0.0464: with virtual text "above" indenting doesn't work well Commit: https://github.com/vim/vim/commit/702bd6c7c61073c0907fd7608911aebee4acd337 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Sep 14 16:09:57 2022 +0100 patch 9.0.0464: with virtual text "above" indenting doesn't work well Problem: With virtual text "above" indenting doesn't work well. Solution: Ignore text properties while adjusting indent. (issue https://github.com/vim/vim/issues/11084)
author Bram Moolenaar <Bram@vim.org>
date Wed, 14 Sep 2022 17:15:06 +0200
parents 15bee6545058
children 562fc4cd9569
files src/charset.c src/globals.h src/indent.c src/testdir/test_textprop.vim src/version.c
diffstat 5 files changed, 28 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/charset.c
+++ b/src/charset.c
@@ -954,7 +954,7 @@ init_chartabsize_arg(
     cts->cts_line = line;
     cts->cts_ptr = ptr;
 #ifdef FEAT_PROP_POPUP
-    if (lnum > 0)
+    if (lnum > 0 && !ignore_text_props)
     {
 	char_u	*prop_start;
 	int	count;
--- a/src/globals.h
+++ b/src/globals.h
@@ -755,6 +755,9 @@ EXTERN int	popup_visible INIT(= FALSE);
 EXTERN int	popup_uses_mouse_move INIT(= FALSE);
 
 EXTERN int	text_prop_frozen INIT(= 0);
+
+// when TRUE computing the cursor position ignores text properties.
+EXTERN int	ignore_text_props INIT(= FALSE);
 #endif
 
 // When set the popup menu will redraw soon using the pum_win_ values. Do not
--- a/src/indent.c
+++ b/src/indent.c
@@ -1289,6 +1289,9 @@ change_indent(
     // for the following tricks we don't want list mode
     save_p_list = curwin->w_p_list;
     curwin->w_p_list = FALSE;
+#ifdef FEAT_PROP_POPUP
+    ignore_text_props = TRUE;
+#endif
     vc = getvcol_nolist(&curwin->w_cursor);
     vcol = vc;
 
@@ -1440,6 +1443,9 @@ change_indent(
 	    ++start_col;
 	}
     }
+#ifdef FEAT_PROP_POPUP
+    ignore_text_props = FALSE;
+#endif
 
     // For MODE_VREPLACE state, we also have to fix the replace stack.  In this
     // case it is always possible because we backspace over the whole line and
--- a/src/testdir/test_textprop.vim
+++ b/src/testdir/test_textprop.vim
@@ -2892,6 +2892,22 @@ func Test_props_with_text_above()
   call StopVimInTerminal(buf)
 endfunc
 
+func Test_prop_above_with_indent()
+  new
+  call setline(1, ['first line', '    second line', '    line below'])
+  setlocal cindent
+  call prop_type_add('indented', #{highlight: 'Search'})
+  call prop_add(3, 0, #{type: 'indented', text: 'here', text_align: 'above', text_padding_left: 4})
+  call assert_equal('    line below', getline(3))
+
+  exe "normal 3G2|a\<CR>"
+  call assert_equal('  ', getline(3))
+  call assert_equal('    line below', getline(4))
+
+  bwipe!
+  call prop_type_delete('indented')
+endfunc
+
 func Test_props_with_text_override()
   CheckRunVimInTerminal
 
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    464,
+/**/
     463,
 /**/
     462,