summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-09-14 16:09:57 +0100
committerBram Moolenaar <Bram@vim.org>2022-09-14 16:09:57 +0100
commit702bd6c7c61073c0907fd7608911aebee4acd337 (patch)
tree83bc9559cd5c5803b671f70c129d274aaffdfd76
parentfebe13892ede37d2a8462b9921e05a55e059db0c (diff)
downloadvim-git-702bd6c7c61073c0907fd7608911aebee4acd337.tar.gz
patch 9.0.0464: with virtual text "above" indenting doesn't work wellv9.0.0464
Problem: With virtual text "above" indenting doesn't work well. Solution: Ignore text properties while adjusting indent. (issue #11084)
-rw-r--r--src/charset.c2
-rw-r--r--src/globals.h3
-rw-r--r--src/indent.c6
-rw-r--r--src/testdir/test_textprop.vim16
-rw-r--r--src/version.c2
5 files changed, 28 insertions, 1 deletions
diff --git a/src/charset.c b/src/charset.c
index a19e55b62..c5edaf41e 100644
--- 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;
diff --git a/src/globals.h b/src/globals.h
index 3d75e20d0..521832428 100644
--- 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
diff --git a/src/indent.c b/src/indent.c
index 134336c12..51585ec9e 100644
--- 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
diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim
index 5167e8e3b..0a4037b9e 100644
--- 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
diff --git a/src/version.c b/src/version.c
index 1c2e49ffd..45afd9d02 100644
--- 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,