# HG changeset patch # User Bram Moolenaar # Date 1663358404 -7200 # Node ID 914b3c64ab92aa010785a1374750973ba468af4f # Parent eeb2c98953bff4d8889722354c257765920f3604 patch 9.0.0482: "g0" moves to wrong location with virtual text "above" Commit: https://github.com/vim/vim/commit/e24b4aba1fbf782954897abdbfc084c4221428eb Author: Bram Moolenaar Date: Fri Sep 16 20:51:14 2022 +0100 patch 9.0.0482: "g0" moves to wrong location with virtual text "above" Problem: "g0" moves to wrong location with virtual text "above". Solution: Compensate for the extra columns. (closes https://github.com/vim/vim/issues/11141) Also fix "g$" diff --git a/src/move.c b/src/move.c --- a/src/move.c +++ b/src/move.c @@ -470,19 +470,29 @@ check_top_offset(void) return FALSE; } +/* + * Update w_curswant. + */ + void +update_curswant_force(void) +{ + validate_virtcol(); + curwin->w_curswant = curwin->w_virtcol +#ifdef FEAT_PROP_POPUP + - curwin->w_virtcol_first_char +#endif + ; + curwin->w_set_curswant = FALSE; +} + +/* + * Update w_curswant if w_set_curswant is set. + */ void update_curswant(void) { if (curwin->w_set_curswant) - { - validate_virtcol(); - curwin->w_curswant = curwin->w_virtcol -#ifdef FEAT_PROP_POPUP - - curwin->w_virtcol_first_char -#endif - ; - curwin->w_set_curswant = FALSE; - } + update_curswant_force(); } /* diff --git a/src/normal.c b/src/normal.c --- 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 --- 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 --- /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 --- /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 --- 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 \") diff --git a/src/version.c b/src/version.c --- 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,