summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-09-16 20:51:14 +0100
committerBram Moolenaar <Bram@vim.org>2022-09-16 20:51:14 +0100
commite24b4aba1fbf782954897abdbfc084c4221428eb (patch)
tree96aed827f612301272d266430fe4afb827fbb483
parent8fa745e7be3a791ac25f93ef0227bbc48ade8a37 (diff)
patch 9.0.0482: "g0" moves to wrong location with virtual text "above"v9.0.0482
Problem: "g0" moves to wrong location with virtual text "above". Solution: Compensate for the extra columns. (closes #11141) Also fix "g$"
-rw-r--r--src/move.c28
-rw-r--r--src/normal.c48
-rw-r--r--src/proto/move.pro1
-rw-r--r--src/testdir/dumps/Test_prop_with_text_above_1a.dump9
-rw-r--r--src/testdir/dumps/Test_prop_with_text_above_1b.dump9
-rw-r--r--src/testdir/test_textprop.vim5
-rw-r--r--src/version.c2
7 files changed, 74 insertions, 28 deletions
diff --git a/src/move.c b/src/move.c
index 4b823ba574..2ef7a9ce36 100644
--- a/src/move.c
+++ b/src/move.c
@@ -470,19 +470,29 @@ check_top_offset(void)
return FALSE;
}
+/*
+ * Update w_curswant.
+ */
void
-update_curswant(void)
+update_curswant_force(void)
{
- if (curwin->w_set_curswant)
- {
- validate_virtcol();
- curwin->w_curswant = curwin->w_virtcol
+ validate_virtcol();
+ curwin->w_curswant = curwin->w_virtcol
#ifdef FEAT_PROP_POPUP
- - curwin->w_virtcol_first_char
+ - curwin->w_virtcol_first_char
#endif
- ;
- curwin->w_set_curswant = FALSE;
- }
+ ;
+ curwin->w_set_curswant = FALSE;
+}
+
+/*
+ * Update w_curswant if w_set_curswant is set.
+ */
+ void
+update_curswant(void)
+{
+ if (curwin->w_set_curswant)
+ update_curswant_force();
}
/*
diff --git a/src/normal.c b/src/normal.c
index 8351685d1d..35f7610c31 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -5491,9 +5491,8 @@ nv_visual(cmdarg_T *cap)
{
if (resel_VIsual_line_count <= 1)
{
- validate_virtcol();
- curwin->w_curswant = curwin->w_virtcol
- + resel_VIsual_vcol * cap->count0 - 1;
+ update_curswant_force();
+ curwin->w_curswant += resel_VIsual_vcol * cap->count0 - 1;
}
else
curwin->w_curswant = resel_VIsual_vcol;
@@ -5506,9 +5505,8 @@ nv_visual(cmdarg_T *cap)
}
else if (VIsual_mode == Ctrl_V)
{
- validate_virtcol();
- curwin->w_curswant = curwin->w_virtcol
- + resel_VIsual_vcol * cap->count0 - 1;
+ update_curswant_force();
+ curwin->w_curswant += + resel_VIsual_vcol * cap->count0 - 1;
coladvance(curwin->w_curswant);
}
else
@@ -5735,13 +5733,19 @@ nv_g_home_m_cmd(cmdarg_T *cap)
cap->oap->inclusive = FALSE;
if (curwin->w_p_wrap && curwin->w_width != 0)
{
- int width1 = curwin->w_width - curwin_col_off();
- int width2 = width1 + curwin_col_off2();
+ int width1 = curwin->w_width - curwin_col_off();
+ int width2 = width1 + curwin_col_off2();
+ int virtcol;
validate_virtcol();
+ virtcol = curwin->w_virtcol
+#ifdef FEAT_PROP_POPUP
+ - curwin->w_virtcol_first_char
+#endif
+ ;
i = 0;
- if (curwin->w_virtcol >= (colnr_T)width1 && width2 > 0)
- i = (curwin->w_virtcol - width1) / width2 * width2 + width1;
+ if (virtcol >= (colnr_T)width1 && width2 > 0)
+ i = (virtcol - width1) / width2 * width2 + width1;
}
else
i = curwin->w_leftcol;
@@ -5815,24 +5819,32 @@ nv_g_dollar_cmd(cmdarg_T *cap)
{
int width1 = curwin->w_width - col_off;
int width2 = width1 + curwin_col_off2();
+ int virtcol;
validate_virtcol();
+ virtcol = curwin->w_virtcol
+#ifdef FEAT_PROP_POPUP
+ - curwin->w_virtcol_first_char
+#endif
+ ;
i = width1 - 1;
- if (curwin->w_virtcol >= (colnr_T)width1)
- i += ((curwin->w_virtcol - width1) / width2 + 1)
+ if (virtcol >= (colnr_T)width1)
+ i += ((virtcol - width1) / width2 + 1)
* width2;
coladvance((colnr_T)i);
// Make sure we stick in this column.
- validate_virtcol();
- curwin->w_curswant = curwin->w_virtcol;
- curwin->w_set_curswant = FALSE;
+ update_curswant_force();
if (curwin->w_cursor.col > 0 && curwin->w_p_wrap)
{
// Check for landing on a character that got split at
// the end of the line. We do not want to advance to
// the next screen line.
- if (curwin->w_virtcol > (colnr_T)i)
+ if (curwin->w_virtcol
+#ifdef FEAT_PROP_POPUP
+ - curwin->w_virtcol_first_char
+#endif
+ > (colnr_T)i)
--curwin->w_cursor.col;
}
}
@@ -5860,9 +5872,7 @@ nv_g_dollar_cmd(cmdarg_T *cap)
}
// Make sure we stick in this column.
- validate_virtcol();
- curwin->w_curswant = curwin->w_virtcol;
- curwin->w_set_curswant = FALSE;
+ update_curswant_force();
}
}
diff --git a/src/proto/move.pro b/src/proto/move.pro
index f9787d6a6f..de8bf51e12 100644
--- a/src/proto/move.pro
+++ b/src/proto/move.pro
@@ -2,6 +2,7 @@
void redraw_for_cursorline(win_T *wp);
void update_topline_redraw(void);
void update_topline(void);
+void update_curswant_force(void);
void update_curswant(void);
void check_cursor_moved(win_T *wp);
void changed_window_setting(void);
diff --git a/src/testdir/dumps/Test_prop_with_text_above_1a.dump b/src/testdir/dumps/Test_prop_with_text_above_1a.dump
new file mode 100644
index 0000000000..c56d88f62e
--- /dev/null
+++ b/src/testdir/dumps/Test_prop_with_text_above_1a.dump
@@ -0,0 +1,9 @@
+|f+0&#ffff4012|i|r|s|t| |t|h|i|n|g| |a|b|o|v|e| @42
+|s+0&#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| @41
+|o+0&#ffffff0|n|e| |t|w>o| @52
+|t|h|r|e@1| |f|o|u|r| @49
+@3|a+0&#ffff4012|n|o|t|h|e|r| |t|h|i|n|g| @43
+|f+0&#ffffff0|i|v|e| |s|i|x| @51
+|~+0#4040ff13&| @58
+|~| @58
+| +0#0000000&@41|1|,|7|-|1|2|7| @6|A|l@1|
diff --git a/src/testdir/dumps/Test_prop_with_text_above_1b.dump b/src/testdir/dumps/Test_prop_with_text_above_1b.dump
new file mode 100644
index 0000000000..d2d9c7b78e
--- /dev/null
+++ b/src/testdir/dumps/Test_prop_with_text_above_1b.dump
@@ -0,0 +1,9 @@
+|f+0&#ffff4012|i|r|s|t| |t|h|i|n|g| |a|b|o|v|e| @42
+|s+0&#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| @41
+>o+0&#ffffff0|n|e| |t|w|o| @52
+|t|h|r|e@1| |f|o|u|r| @49
+@3|a+0&#ffff4012|n|o|t|h|e|r| |t|h|i|n|g| @43
+|f+0&#ffffff0|i|v|e| |s|i|x| @51
+|~+0#4040ff13&| @58
+|~| @58
+| +0#0000000&@41|1|,|1|-|1|2|1| @6|A|l@1|
diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim
index d45409ebc5..259ff9c366 100644
--- a/src/testdir/test_textprop.vim
+++ b/src/testdir/test_textprop.vim
@@ -2869,6 +2869,11 @@ func Test_props_with_text_above()
let buf = RunVimInTerminal('-S XscriptPropsWithTextAbove', #{rows: 9, cols: 60})
call VerifyScreenDump(buf, 'Test_prop_with_text_above_1', {})
+ call term_sendkeys(buf, "ggg$")
+ call VerifyScreenDump(buf, 'Test_prop_with_text_above_1a', {})
+ call term_sendkeys(buf, "g0")
+ call VerifyScreenDump(buf, 'Test_prop_with_text_above_1b', {})
+
call term_sendkeys(buf, "ggI")
call VerifyScreenDump(buf, 'Test_prop_with_text_above_2', {})
call term_sendkeys(buf, "inserted \<Esc>")
diff --git a/src/version.c b/src/version.c
index 8f6988b838..19f9e00ec9 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 */
/**/
+ 482,
+/**/
481,
/**/
480,